0

私の最初の関数では、NSMutableDictionary を作成し、それを配列に保存します。

NSMutableArray* tempPlayersArray = [NSMutableArray arrayWithArray: [[NSUserDefaults standardUserDefaults] arrayForKey: @"kgpsTempArray"]];
NSMutableDictionary *tempPlayerDictArray = [[NSMutableDictionary alloc] init];

if (!(userDeviceName)) {
    [tempPlayerDictArray setValue:userDeviceName forKey:@"DeviceName"];
}else{
    [tempPlayerDictArray setValue:@"empty" forKey:@"DeviceName"];
}
[tempPlayersArray addObject:tempPlayerDictArray];

[defaults setObject:tempPlayersArray forKey:@"kgpsTempArray"];
[defaults synchronize];

私の 2 番目の関数では、NSCFDictionary として取得します。これは可変ではありません。

NSMutableArray* tempPlayersArray = [NSMutableArray arrayWithArray: [[NSUserDefaults standardUserDefaults] arrayForKey: @"kgpsTempArray"]];
NSMutableDictionary *dictionaryForSearching = [[NSMutableDictionary alloc] init];
NSLog(@"%@",[dictionaryForSearching class]);

dictionaryForSearching = [tempPlayersArray objectAtIndex:index];

NSLog(@"%@",[[tempPlayersArray objectAtIndex:index] class]);
NSLog(@"%@",[dictionaryForSearching class]);

最初のログには「NSDictionaryM」が表示されます。
2 番目のログには「NSCFDictionary」が表示されます。
そして3番目は「NSCFDictionary」も示しています...

誰かが私に理由を説明できますか? そして、それを修正する方法は?

4

3 に答える 3

4

NSUserDefaultsは不変のオブジェクトで機能するため、辞書を返すときに変更されるのはそのためです。

あなたはこれを試すことができます:

dictionaryForSearching = [[NSMutableDictionary alloc] initWithDictionary:[tempPlayersArray objectAtIndex:index]];
于 2013-03-06T09:57:57.330 に答える
0

はい、NSUserDefaults自由にコピー、永続化、逆シリアル化できます。可変オブジェクトを返さないと仮定します。可変オブジェクトが必要な場合は、可変コピーを作成します。

于 2013-03-06T09:58:07.057 に答える
0

すべてはここから依存します:

NSMutableArray* tempPlayersArray = [NSMutableArray arrayWithArray: [[NSUserDefaults standardUserDefaults] arrayForKey: @"kgpsTempArray"]];

NSUserDefaults を読み取ると、常に Immutable オブジェクトが得られます。

于 2013-03-06T09:59:44.553 に答える