【发布时间】:2015-05-19 08:40:19
【问题描述】:
最近在学习NSUserDefaults,然后做了一个demo如下:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *activity_array = [NSMutableArray array];
NSMutableArray *movie_array = [NSMutableArray array];
[defaults setObject:activity_array forKey:@"activity"];
[defaults setObject:movie_array forKey:@"movie"];
[defaults synchronize];
然后我尝试编写以下内容,在本文期间我将其称为“code2”:
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSMutableArray *array = [userDefault objectForKey:@"activity"];
[array addObject:@"123"];
演示仍然有效。
但是,当我将“code2”替换为以下代码时,演示会崩溃:
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSMutableArray *array = [userDefault objectForKey:@"movie"];
[array addObject:@"123"];
如您所见,差异是关键。
为什么会崩溃?
【问题讨论】:
-
因为你的问题很简单,所以没有问你,但是当你说你有崩溃时,请确保添加崩溃日志/堆栈跟踪。如果你这样做了,你自己就可以得到答案,通过阅读日志,你可以看到:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'非常清楚意味着你正在改变一个不可变对象。 ;-) -
先生,我想问更多,因为我想更改 NSUserDefault.so 存储的数组,所以我应该怎么做?
-
如果您想修改数组的内容并再次保存,请按照我的回答(您刚刚接受的那个!)中的说明进行操作。第 1 步:从 userdefaults 中获取数组,第 2 步:制作数组的可变副本,第 3 步:添加/删除所需的对象,第 4 步,将数组保存在 userdefaults 中,现在已修改!
-
我编辑了我的答案,使其更加清晰
-
第4步,如何保存?只是[userDefaults synchronize]?我试过了,失败了。
标签: ios nsarray nsuserdefaults