2010-12-06 1 views
0

私はこの問題に関するすべての場所を見てきました。私がしようとしているのは、nsuser defaultsオブジェクトを作成し、それに変更可能な配列を追加し、nsuserdefaultsオブジェクトを変更しようとすることです。iphone xcode; mutableCopyはまだ不変ですか?

//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"] ; 

[defaults synchronize]を追加することはできません。

しかし、驚くべきことにデフォルトオブジェクトはまだ変更できません。それは__NSCFArrayであり、__NSCFArrayMではありません。 提案はありますか?

編集:コンソール出力 クラス:__NSCFArray =>私は変更可能なコピーを作成したので、NSCFArrayMですか? [ _NSCFArray replaceObjectAtIndex:withObject:]:不変オブジェクトに送られた変異法」

答えて

1

はそれの世話をする必要があります

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

を使用して、NSMutableArrayのように、アレイをキャストしてみます。

EDIT:

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

を次に、変更する:

あなたが実際にNSUserDefaultsでNSMutableArraysを保存することができないことを考えると、私はあなただけ先に行くとそのように、全体の事を再割り当てすることをお勧めします値、

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

HI sam、それは助けませんでした - それはまだ配列が不変であるというエラーを投げます。しかし、woul'dnt [xml mutableCopy]は可変配列を作成しますか?なぜこの場合は不変ですか? – Veeru

+0

ああ、その他の答えに良いもの! NSUserDefaultsを使用してこの特定の問題を処理することはできないようです。 –

+0

これをよりうまく行う方法について、私の答えを編集しました。 –

5

documentationから:

値として可変オブジェクトを設定した場合でも、NSUserDefaultsから返される値は不変です。たとえば、 "MyStringDefault"の値として可変文字列を設定した場合、後でstringForKeyを使用して取得する文字列は不変です。

また、あなたはかなり醜いリークを持っています。 mutableCopyによって返されたオブジェクトの所有者ですが、そのオブジェクトへの唯一の参照を失ったために所有権を放棄することはできません(xml配列は変更可能です)。

+0

うん、興味深い、それは私のアプリのための多くのロジック変更を意味するだろう:( 私は、ドキュメントに感謝、情報のおかげで - 私はソリューションがない解決策を見つけるために私の頭を割っていただろう:) – Veeru

関連する問題