由于未捕获的异常“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”错误而终止应用程序

“由于未捕获的异常而终止应用程序”在推送视图控制器时崩溃

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序