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

在我的第二个函数中,我将它作为 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”。
第二个日志显示“NSCFDictionary”。
第三个也显示“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 总是会给你不可变的对象。

于 2013-03-06T09:59:44.553 回答