Ios NSUserDefaults中存储的NSMutableArray不会保存数据

Ios NSUserDefaults中存储的NSMutableArray不会保存数据,ios,cocoa,nsmutablearray,nsuserdefaults,Ios,Cocoa,Nsmutablearray,Nsuserdefaults,当用户通过我的iPhone应用程序登录时,我会在NSUserDefaults中创建一组默认元素。其中一个是NSMutableArray,我通过以下方式添加它: NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; NSMutableArray *theArray = [NSMutableArray array]; [prefs setObject:theArray forKey:@"theArray"]; 这是完美的。但是

当用户通过我的iPhone应用程序登录时,我会在NSUserDefaults中创建一组默认元素。其中一个是NSMutableArray,我通过以下方式添加它:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSMutableArray *theArray = [NSMutableArray array];
[prefs setObject:theArray forKey:@"theArray"];
这是完美的。但是,当我想从数组中插入或检索值时,出现了一些问题。以下是我的应用程序中另一个文件的摘录:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[[prefs objectForKey:@"theArray"] setValue:@"This is a value" forKey:@"aValue"];
NSLog(@"%@", [[prefs objectForKey:@"theArray"] valueForKey:@"aValue"]);
当代码运行时,我希望在控制台中看到这是一个值,但我得到的是:

2011-08-08 18:35:17.503 MyApp[7993:10d03] (
)

为什么数组是空的?我用NSArray做了同样的尝试,结果也一样。

当您将可变对象存储到NSUserDefaults时,它会存储它的一个不可变副本,因此您不能像那样直接更改它。您必须从默认值中获取可变副本,对其进行更改,然后将其设置回初始值,以替换默认值中的旧对象

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSMutableArray *mutableArrayCopy = [[prefs objectForKey:@"theArray"] mutableCopy];
[mutableArrayCopy addObject:@"some new value"];
[prefs setObject:mutableArrayCopy forKey:@"theArray"];
[mutableArrayCopy release];

当您将可变对象存储到NSUserDefaults时,它将存储它的不可变副本,因此您不能像那样直接更改它。您必须从默认值中获取可变副本,对其进行更改,然后将其设置回初始值,以替换默认值中的旧对象

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSMutableArray *mutableArrayCopy = [[prefs objectForKey:@"theArray"] mutableCopy];
[mutableArrayCopy addObject:@"some new value"];
[prefs setObject:mutableArrayCopy forKey:@"theArray"];
[mutableArrayCopy release];
NSArray*savedArray=[NSArray数组及其对象:@obj1、@obj2、@obj3、nil]; NSUserDefaults*userDefaults=[NSUserDefaults standardUserDefaults]; [userDefaults setObject:savedArray forKey:@key_for_savedArray]; [用户默认同步]; //要检索阵列,请使用: NSArray*RetriedArray=[userDefaults objectForKey:@key_for_savedArray]

NSArray*savedArray=[NSArray数组及其对象:@obj1、@obj2、@obj3、nil]; NSUserDefaults*userDefaults=[NSUserDefaults standardUserDefaults]; [userDefaults setObject:savedArray forKey:@key_for_savedArray]; [用户默认同步]; //要检索阵列,请使用: NSArray*RetriedArray=[userDefaults objectForKey:@key_for_savedArray]


不要忘记同步对NSUserDefault所做的更改。看:谢谢,沃尔夫冈。但问题仍然存在。不要忘记同步对NSUserDefaults所做的更改。看:谢谢,沃尔夫冈。但问题依然存在。当我按照你的建议用setValue:forKey:代替addObject替换第三行时,我仍然得到一个空数组。你不能在NSMutableArray上执行setValue:forKey:在NSMutableArray上,你需要NSMutableDictionary,这就是为什么我在上面发布的代码中将它改为addObject:妈的,你是对的。我刚刚用一个NSMutableDictionary替换了NSMutableArray,现在一切都运行得很好。谢谢当我按照你的建议用setValue:forKey:代替addObject替换第三行时,我仍然得到一个空数组。你不能在NSMutableArray上执行setValue:forKey:在NSMutableArray上,你需要NSMutableDictionary,这就是为什么我在上面发布的代码中将它改为addObject:妈的,你说得对。我刚刚用一个NSMutableDictionary替换了NSMutableArray,现在一切都运行得很好。谢谢