最近我正在学习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];
然后我尝试编写以下内容,我将在这篇文章中称之为“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"];
正如您所看到的,区别在于关键 为什么这会崩溃?
答案 0 :(得分:5)
NSUserDefaults
可以存储NSMutableArrays
,但会将它们转换为不可变数组。
同样适用于NSDictionary
和NSMutableDictionary
。
这意味着如果您想要将对象添加到刚刚从NSUserDefaults
中提取的数组中,您必须首先使用-mutableCopy
作为可变项,或者{{1 }}
-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];
,并且您可以像以前一样保存它。如果之后检索它,它将是修改后的数组。但请注意,arr
和arrays
从dictionaries
获取时始终是不可变的。你必须这样做"技巧"每次您想要从NSUserDefaults
修改数组或字典。
编辑:在测试代码之后,我唯一的假设是当你检索它时你的无崩溃数组只是nil。使用断点进行调试以验证这一点,但我确定接近101%。
EDIT2:trojanfoe比我做得更快!
答案 1 :(得分:3)
正如其他人指出的那样,从NSUserDefaults
返回的数组是不可变的,因此在调用addObject:
时会抛出异常,但是如果数组是{{}}则不会发生异常{1}}因为默认忽略nil
对象的调用方法(发送消息)。
因此,我相信您的code2可以用作用户默认设置中不存在的对象nil
,而@"activity"
可以使用。{/ p>
答案 2 :(得分:0)
NSUserDefaults返回的数组和字典总是不可变的,即使你设置的数组是可变的。您必须调用-mutableCopy。
答案 3 :(得分:0)
试试这个:
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSMutableArray *array = [[userDefault objectForKey:@"movie"]mutableCopy];
答案 4 :(得分:0)
userDefault中的对象不可变..试试这个
NSMutableArray *arr = (NSMutableArray *)[userDefault objectForKey:@"activity"];
或者如果你喜欢使用id并首先检查它的类以防止崩溃:
id variableName = [userDefault objectForKey:@"activity"];
if ([[variableName class] isEqual:[NSArray class]])
{
NSMutableArray *arr = [[NSMutableArray alloc] initWithArray:(NSArray *)variableName];
NSMutableArray *arr = [(NSArray *)variableName mutableCopy];
}
else if ([[variableName class] isEqual:[NSNull class]])
NSLog(@"no object with key:activity");
else
NSLog(@"not array");
//Happy coding.. :)