¿Por qué NSUserDefaults no puede save NSMutableDictionary?

Estoy intentando save un NSMutableDictionary con NSUserDefaults . Leí muchas publicaciones sobre el tema en stackoverflow … También encontré una opción que funcionó; sin embargo, desafortunadamente funcionó solo una vez y luego comenzó a save (nulo) solamente. ¿Alguien tiene una pista?

Gracias

Código para save:

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

Código para cargar:

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

Código para agregar objects al 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"]; 

Codifique a NSLog () los valores:

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

Y también las keys son (nulas):

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

Desde la documentation de Apple para NSUserDefaults objectForKey :
El object devuelto es inmutable , incluso si el valor que configuró originalmente era mutable.

La línea:

 dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

descarta el NSMutableDictionary creado anteriormente y devuelve un NSDictionary .

Cambie la carga a:

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

Ejemplo completo, tampoco hay necesidad de usar NSKeyedArchiver en este ejemplo:

 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]); } 

Salida NSLog:
key: key 2, valor: 1
key: key 1, valor: 0
key: key 4, valor: 4
key: key 3, valor: 2