Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина: "setObjectForKey: ключ не может быть равен nil"

* Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина: "* setObjectForKey: ключ не может быть равен 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

1 ответ

Согласно информации, setObjectForKey: key не может быть nil, поэтому вам нужно проверить ключ и значение, чтобы убедиться, что ни один из них не равен nil перед вашим setObject:ForKey:,

Добавьте немного защиты, как это:

-(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];

}
Другие вопросы по тегам