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)
如您所见,差异是关键.
为什么会崩溃?
NSUserDefaults可以存储NSMutableArrays,但会将它们变成不可变数组.
这同样适用于NSDictionary和NSMutableDictionary.
这意味着如果你想将一个对象添加到你刚刚从中提取的数组,你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比我做得更快!
| 归档时间: |
|
| 查看次数: |
394 次 |
| 最近记录: |