NSUserDefaults保存两个导致崩溃的阵列

Bus*_*sen 1 nsuserdefaults nsarray ios

最近我正在学习NSUserDefaults,然后做了如下演示:

 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];
Run Code Online (Sandbox Code Playgroud)

然后我尝试编写以下内容,我将在这篇文章的持续时间内调用"code2":

 NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
 NSMutableArray *array = [userDefault objectForKey:@"activity"];
 [array addObject:@"123"];
Run Code Online (Sandbox Code Playgroud)

演示仍然有效.
但是当我用以下代码替换"code2"时,演示崩溃了:

 NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
 NSMutableArray *array = [userDefault objectForKey:@"movie"];
 [array addObject:@"123"];
Run Code Online (Sandbox Code Playgroud)

如您所见,差异是关键.
为什么会崩溃?

Gil*_*and 5

NSUserDefaults可以存储NSMutableArrays,但会将它们变成不可变数组.

这同样适用于NSDictionaryNSMutableDictionary.

这意味着如果你想将一个对象添加到你刚刚从中提取的数组,你NSUserDefaults必须首先使它变为可变,-mutableCopy例如,使用或-initWithArray.

NSArray *array = [userDefault objectForKey:@"movie"];

//This works
NSMutableArray *arr = [NSMutableArray alloc]initWithArray:array];

//This works too and is more commonly used.
NSMutableArray *arr = [array mutableCopy];
Run Code Online (Sandbox Code Playgroud)

您现在可以arr毫无困难地修改阵列,并且您可以像以前一样保存它.如果之后检索它,它将是修改后的数组.但是要小心,arrays并且dictionaries从取而代之时总是不可变的NSUserDefaults.每次你想修改数组或字典时,你都必须做"技巧" NSUserDefaults.

编辑:在测试代码之后,我唯一的假设是当你检索它时你的无崩溃数组只是nil.使用断点进行调试以验证这一点,但我接近101%肯定.

EDIT2:trojanfoe比我做得更快!