iphone nsmutablearray nsuserdefaults

iphone - inserte el objeto en un NSMutableArray guardado con NSUserDefaults



(6)

Aquí hay un ejemplo completo de trabajo:

- (void)saveScore:(NSNumber *)score { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSMutableArray *scoreList = [[NSMutableArray alloc] initWithArray: [defaults objectForKey:@"ScoreList"]]; [scoreList addObject:score]; [defaults setObject:scoreList forKey:@"ScoreList"]; [defaults synchronize]; }

Primero leemos los datos almacenados en una matriz mutable, actualizamos la matriz, guardamos la nueva matriz y luego sincronizamos los valores predeterminados del usuario para registrar permanentemente los cambios.

¡Espero que esto ayude!

Tengo un NSMutableArray guardado con NSUserDefaults. Esta matriz es mi elemento "favorito" que el usuario puede guardar, así que cuando quiero agregar un elemento, necesito leer la matriz (de NSuserDefault) y guardar en la primera posición libre.

Estoy usando este método para agregar un valor en el NSMutableArray

-(IBAction)save{ NSMutableArray *abc = [[NSUserDefaults standardUserDefaults] objectForKey:@"12345"]; int n = [abc count]; [abc insertObject:@"aaa" atIndex:n]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [[NSUserDefaults standardUserDefaults] setObject:abc forKey:@"12345"]; [defaults synchronize]; [abc release]; }

¿Cual es el trato? Que si el usuario llama a este método dos veces, la segunda vez que la aplicación falla con este registro:

* Aplicación de terminación debido a la excepción no detectada ''NSInternalInconsistencyException'', razón: ''- [__ NSCFArray insertObject: atIndex:]: método de mutación enviado a objeto inmutable''

¿por qué? ¿Y por qué la segunda vez? La primera vez funciona bien!


Arreglo rapido:

_retrivedArray = [_mutableArray mutableCopy];


Copie la matriz de un NSUserDefault esta manera:

[YourArray addObjectsFromArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"NSUSD"]];

o

YourArray = [[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"NSUSD"]]; [YourArray addObject: (currentObject)];


Otra opción es:

[[NSUserDefaults standardUserDefaults] setObject:[[[NSUserDefaults standardUserDefaults] objectForKey:@"12345"] arrayByAddingObject:object] forKey:@"12345"];


Se debe a que NSMutablepointer apunta un objeto NSUserDefault directamente. Primero debe copiar el objeto NSUserDefault a una matriz que procesarlo.

NSMutableArray *arr= [NSMutableArray arrayWithObjects:@"asd",@"dsa",nil]; [[NSUserDefaults standardUserDefaults] setObject:arr forKey:@"12345"]; NSMutableArray *abc = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"12345"]]; //[[NSUserDefaults standardUserDefaults] objectForKey:@"12345"]; int n = [abc count]; [abc insertObject:@"aaa" atIndex:n]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [[NSUserDefaults standardUserDefaults] setObject:abc forKey:@"12345"]; [defaults synchronize]; [abc release];


NSUserDefaults siempre devuelve objetos inmutables, incluso si el objeto original era mutable. Está en la documentación para objectForKey :

El objeto devuelto es inmutable, incluso si el valor que estableció originalmente era mutable.

Deberá crear una copia del objeto devuelto antes de modificarlo, utilizando [NSMutableArray arrayWithArray:]

Probablemente también es mejor usar el método NSUserDefaults de NSUserDefaults si está recuperando una matriz. Docs aquí: https://developer.apple.com/documentation/foundation/userdefaults