由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“setObjectForKey:键不能为零”[重复]
Posted
技术标签:
【中文标题】由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“setObjectForKey:键不能为零”[重复]【英文标题】:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ' setObjectForKey: key cannot be nil' [duplicate] 【发布时间】:2015-08-06 03:25:40 【问题描述】:* 由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'* setObjectForKey: key cannot 是零' ***
我想我正在尝试将一个对象(它是 nil)添加到字典中作为键。我不知道如何解决这个问题?
@interface BNRImageStore ()
@property (nonatomic, strong) NSMutableDictionary *dictionary;
@end
@implementation BNRImageStore
+(instancetype)sharedStore
static BNRImageStore *sharedStore;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
sharedStore = [[self alloc]initPrivate];
);
return sharedStore;
-(instancetype)initPrivate
self = [super init];
if (self)
_dictionary = [[NSMutableDictionary alloc]init];
return self;
-(NSString*)imagePathForKey:(NSString*)key
NSArray *documentDirectories =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES);
NSString *documentDirectory = [documentDirectories firstObject];
return [documentDirectory stringByAppendingPathComponent:key];
-(void)setImage:(UIImage*)image forKey:(NSString*)key
self.dictionary[key] = image;
NSString *imagePath = [self imagePathForKey:key];
NSData *data = UIImageJPEGRepresentation(image, 0.5);
[data writeToFile:imagePath atomically:YES];
-(UIImage*)imageForKey:(NSString*)key
UIImage *result = self.dictionary[key];
if (!result)
NSString *imagePath = [self imagePathForKey:key];
result = [UIImage imageWithContentsOfFile:imagePath];
if (result)
[ self.dictionary setObject:result forKey:key];
else
NSLog(@"ERROR");
return result;
-(void)deleteImageForKey:(NSString*)key
if (!key)
return;
[self.dictionary removeObjectForKey:key];
NSString *imagePath = [self imagePathForKey:key];
[[NSFileManager defaultManager]removeItemAtPath:imagePath error:nil];
@end
【问题讨论】:
哪一行导致错误?而provlem是key,而不是value,是nil。 如何使密钥非零?对不起,我对此很陌生! @rmaddy 首先指出问题中的哪一行代码导致了错误。 @rmaddy 我认为这可能是第 18 行的关键?我不完全确定 您的问题中没有行号。你怎么能不确定它是哪条线?在调试器中运行应用程序并查看它在哪里崩溃。 Xcode 会告诉你确切的位置。如果没有,请查看raywenderlich.com/10209/my-app-crashed-now-what-part-1 【参考方案1】:根据资料,setObjectForKey:key不能为nil,所以需要检查key和value,确保你的setObject:ForKey:
之前都不为nil。
像这样添加一些保护:
-(void)setImage:(UIImage*)image forKey:(NSString*)key
// Add this protection
if (!image || !key)
return;
self.dictionary[key] = image;
NSString *imagePath = [self imagePathForKey:key];
NSData *data = UIImageJPEGRepresentation(image, 0.5);
[data writeToFile:imagePath atomically:YES];
【讨论】:
它仍然引发相同的异常:*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“*** setObjectForKey: key cannot be nil”***第一次抛出调用堆栈: @WenjunAMao 所以找出你所有的setObjectForKey
并添加对象的保护而不是nil。
key是nil,不是object。
仅供参考 - 仅代码的答案在这里不受欢迎。请添加一些错误说明以及您的答案如何解决问题。以上是关于由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“setObjectForKey:键不能为零”[重复]的主要内容,如果未能解决你的问题,请参考以下文章
由于未捕获的异常而终止应用程序 [UIImageView _isResizable]
由于未捕获的异常“NSInternalInconsistencyException”错误而终止应用程序