Почему NSUserDefaults не удается сохранить NSMutableDictionary?


Я пытаюсь сохранить NSMutableDictionary с помощью NSUserDefaults. Я прочитал много постов на эту тему в stackoverflow... Я также нашел один вариант, который работал; однако, к сожалению, он работал только один раз, а затем он начал сохранять (null) только. У кого-нибудь есть подсказка?

Спасибо

Код для сохранения:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:dictionary] forKey:@"Key"];
[[NSUserDefaults standardUserDefaults] synchronize];

Код для загрузки:

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc]init];
NSData *data = [[NSUserDefaults standardUserDefaults]objectForKey:@"Key"];
dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data];

Код для добавления объектов в NSMutableDictionary:

[dictionary setObject:[NSNumber numberWithInt:0] forKey:@"Key 1"];
[dictionary setObject:[NSNumber numberWithInt:1] forKey:@"Key 2"];
[dictionary setObject:[NSNumber numberWithInt:2] forKey:@"Key 3"];

Код для значений NSLog ():

for (NSString * key in [dictionary allKeys]) {
    NSLog(@"key: %@, value: %i", key, [[dictionary objectForKey:key]integerValue]);
}

А также ключи (null):

NSLog(@"%@"[dictionary allKeys]);
1 3

1 ответ:

Из документации Apple для NSUserDefaults objectForKey:
Возвращаемый объект является неизменяемым , даже если изначально заданное значение было изменяемым.

Строка:

dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data];

Отбрасывает ранее созданное NSMutableDictionary и возвращает NSDictionary.

Измените загрузку на:

NSData *data = [[NSUserDefaults standardUserDefaults]objectForKey:@"Key"];
dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data];

Полный пример, также нет необходимости использовать NSKeyedArchiver в этом примере:

NSDictionary *firstDictionary = @{@"Key 4":@4};
[[NSUserDefaults standardUserDefaults] setObject:firstDictionary forKey:@"Key"];

NSMutableDictionary *dictionary = [[[NSUserDefaults standardUserDefaults] objectForKey:@"Key"] mutableCopy];

dictionary[@"Key 1"] = @0;
dictionary[@"Key 2"] = @1;
dictionary[@"Key 3"] = @2;

for (NSString * key in [dictionary allKeys]) {
    NSLog(@"key: %@, value: %@", key, [dictionary objectForKey:key]);
}

Вывод NSLog:
ключ: ключ 2, Значение: 1
ключ: Ключ 1, значение: 0
ключ: Ключ 4, значение: 4
ключ: Ключ 3, значение: 2