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

时间:2015-05-19 08:40:19

标签: ios nsarray nsuserdefaults

最近我正在学习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"];

正如您所看到的,区别在于关键 为什么这会崩溃?

5 个答案:

答案 0 :(得分:5)

NSUserDefaults可以存储NSMutableArrays,但会将它们转换为不可变数组。

同样适用于NSDictionaryNSMutableDictionary

这意味着如果您想要将对象添加到刚刚从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]; ,并且您可以像以前一样保存它。如果之后检索它,它将是修改后的数组。但请注意,arrarraysdictionaries获取时始终是不可变的。你必须这样做"技巧"每次您想要从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.. :)