2011-04-26 10 views
13

Cuando uso este método por primera vez funciona bien, pero cuando lo llamé por segunda vez recibí el error "Método de mutación enviado al objeto inmutable". El problema está en línea con el comando "addObject".Método de mutación enviado al objeto inmutable

-(IBAction) save: (id) sender{ 

NSMutableArray *placesT= [[NSUserDefaults standardUserDefaults] objectForKey:@"placesT"]; 

if (!placesT) { 
    placesT=[[[NSMutableArray alloc] init] autorelease]; 
} 

[placesT addObject: [NSString stringWithFormat:@"%@", tagF.text] ]; 

NSUserDefaults *tUD=[NSUserDefaults standardUserDefaults]; 
[tUD setObject:placesT forKey:@"placesT"]; 
[tUD synchronize]; 

[self dismissModalViewControllerAnimated:YES]; 

}

+0

Bueno el problema es con la inicialización placesT. Mi apuesta es que el estándar NSUserDefault está vacío la primera vez y va al segundo init. También tienes una fuga de memoria. – Radu

+0

Tenga en cuenta que probablemente pueda reemplazar '[NSString stringWithFormat: @"% @ ", tagF.text]' con 'tagF.text' solamente. No es necesario enviar '+ stringWithFormat ::' si 'text' ya es' NSString'. –

Respuesta

24

A medida que la documentación para NSUserDefaults dice: "Los valores devueltos de NSUserDefaults son inmutables, incluso si se establece un objeto mutable como el valor." Siempre que desee cambiar una colección que obtiene de NSUserDefaults, debe obtener la versión inmutable, haga un mutableCopy, modifíquelo y vuelva a configurarlo.

+2

para agregar a esto que sería, por ejemplo: someMutableArray = [yourArrayFromDictionary mutableCopy]; espero que haya ayudado :) – jimbob

10

Esto se debe a que el objeto almacenado en NSUserDefaults no es el array mutable, sino una matriz normal.

- (IBAction)save:(id)sender { 

    NSMutableArray *placesT = nil; 
    NSArray *tempArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"placesT"]; 

    if (tempArray) { 
     placesT = [tempArray mutableCopy]; 
    } else { 
     placesT = [[NSMutableArray alloc] init]; 
    } 

    [placesT addObject:[NSString stringWithFormat:@"%@", tagF.text]]; 

    NSUserDefaults *tUD = [NSUserDefaults standardUserDefaults]; 
    [tUD setObject:placesT forKey:@"placesT"]; 
    [tUD synchronize]; 

    [self dismissModalViewControllerAnimated:YES]; 
    [placesT release]; 
} 
+0

Usted está filtrando la copia. – smorgan

+0

@smorgen, tienes toda la razón. – rckoenes

3

placesT es una matriz no mutable, ya sea siempre establecer placesT un objeto mutable siempre o uso siguiente código.

NSMutableArray *placesT= [[[NSUserDefaults standardUserDefaults] objectForKey:@"placesT"] mutableCopy]; 
0

Esto debería funcionar:

- (IBAction) excepto: (id) {emisor

NSMutableArray *placesT= [[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults] 

objectForKey: @ "placesT"]];

if (!placesT) { 
    placesT=[[[NSMutableArray alloc] init] autorelease]; 
} 

[placesT addObject: [NSString stringWithFormat:@"%@", tagF.text] ]; 

NSUserDefaults *tUD=[NSUserDefaults standardUserDefaults]; 
[tUD setObject:placesT forKey:@"placesT"]; 
[tUD synchronize]; 

[self dismissModalViewControllerAnimated:YES]; } 
Cuestiones relacionadas