2010-12-06 8 views
0

J'ai regardé partout sur ce problème. Tout ce que j'essaie de faire est de créer un objet par défaut nsuser, puis d'ajouter un tableau mutable et d'essayer de modifier l'objet nsuserdefaults.iphone xcode; mutableCopy encore immuable?

//Created a sample array 
NSMutableArray *xml=[[NSMutableArray alloc] init]; 
[xml addObject:@"x"]; 
[xml addObject:@"x"]; 
[xml addObject:@"x"]; 
[xml addObject:@"x"]; 
[xml addObject:@"x"]; 
//assigned to defaults object which is created previously with a mutableCopy 
[defaults setObject:[xml mutableCopy] forKey:@"userLocationsDetailedXML"]; 
//Tried to modify the defaults object - which at this point should be mutable 
[[defaults objectForKey:@"userLocationsDetailedXML" ] replaceObjectAtIndex:1 withObject:@"y"] ; 

Ajout [defaults synchronize] aide does'nt soit.

Mais étonnamment, l'objet par défaut est toujours immuable. C'est __NSCFArray, pas __NSCFArrayM comme prévu Des suggestions?

edit: console output Classe: __NSCFArray => Ne devrait-il pas être _ NSCFArrayM depuis que j'ai créé une copie mutable? [ _NSCFArray replaceObjectAtIndex: withObject:]: Méthode objet envoyé à muter immuable »

Répondre

1

Essayez la coulée du tableau comme NSMutableArray, en utilisant

[(NSMutableArray *)[defaults objectForKey:@"userLocationsDetailedXML"] replaceObjectAtIndex:1 withObject:@"y"] ; 

qui devrait en prendre soin.

EDIT:

Étant donné que vous ne pouvez pas réellement stocker NSMutableArrays dans NSUserDefaults, je vous recommande juste aller de l'avant et réattribuer la chose entière, comme ceci:

NSMutableArray *xml = [[NSMutableArray alloc] init]; 
    [xml addObject:@"x"]; 
    [xml addObject:@"x"]; 
    [xml addObject:@"x"]; 
    [xml addObject:@"x"]; 
    [xml addObject:@"x"]; 

[defaults setObject:xml forKey:@"userLocationsDetailedXML"]; 
[xml release]; 

Puis, pour changer la valeurs,

NSMutableArray *userLoc = [[defaults objectForKey:@"userLocationsDetailedXML"] mutableCopy]; 
[userLoc replaceObjectAtIndex:1 withObject:@"y"]; 
[defaults setObject:userLoc forKey:@"userLocationsDetailedXML"]; 
[userLoc release]; //thanks, dreamlax! 
+0

Salut sam, cela n'a pas aidé non plus - il jette quand même une erreur que le tableau est immuable. Mais woul'dnt [xml mutableCopy] crée un tableau mutable? pourquoi est-ce immuable dans ce cas? – Veeru

+0

Ooh, bonnes choses sur cette autre réponse! On dirait que vous ne pouvez pas utiliser NSUserDefaults pour prendre soin de ce problème particulier. –

+0

Juste modifié ma réponse avec une suggestion pour mieux faire. –

5

De l'documentation:

Les valeurs renvoyées par NSUserDefaults sont immuables, même si vous définissez un objet mutable comme valeur. Par exemple, si vous définissez une chaîne mutable comme valeur de "MyStringDefault", la chaîne que vous récupérerez plus tard à l'aide de stringForKey: sera immuable.

De plus, vous avez une fuite plutôt laide; vous êtes le propriétaire de l'objet renvoyé par mutableCopy mais vous n'avez aucun moyen de renoncer à la propriété car vous avez perdu la seule référence à cet objet (le tableau xml est de toute façon modifiable).

+0

hmm, intéressant, cela signifierait beaucoup de changement de logique pour mon application :( J'ai raté cela dans les docs, merci pour l'info - j'aurais craqué ma tête pour trouver une solution où il n'y a pas de solution :) – Veeru