2013-03-06 88 views
0

在我的第一个函数中,我创建了一个NSMutableDictionary并将其保存在一个数组中。MutableDictionary变得不可变

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

NSUserDefaults适用于不可变对象,所以这就是当您返回字典时它被更改的原因。

你可以试试这个:

dictionaryForSearching = [[NSMutableDictionary alloc] initWithDictionary:[tempPlayersArray objectAtIndex:index]]; 
+0

非常感谢! – 2013-03-06 11:11:24

0

是,NSUserDefaults是自由复制,坚持和反序列化,因为它喜欢。假定它不返回可变对象。如果您需要一个可变对象,请制作一个可变副本。

0

每一件事情取决于从这里:

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

NSUserDefaults的阅读总是给你不可变对象。