主题说明了一切。我有一个存储在NSUserDefaults
中的字典词典(是的,它是一个字典!)。出于某些原因,我在将对象设置为字典后立即在main.m处获得SIGABRT。这是代码:
planDict = [[NSUserDefaults standardUserDefaults]objectForKey:[NSString stringWithFormat:@"Plan_%@", self.planName]];
pageOne = [planDict objectForKey:@"Page_1"];
pageTwo = [planDict objectForKey:@"Page_2"];
pageThree = [planDict objectForKey:@"Page_3"];
[pageOne setObject:@"The Object" forKey:@"First Key"];
[pageOne setObject:@"The Other Object" forKey:@"Second Key"];
//other setters
我已经调试了它,直到第[pageOne setObject:@"TheObject" forKey:@"First Key"];
行。当我跨过它时它刚刚崩溃(在main.m中的SIGABRT)。
这是崩溃前的日志:
(gdb) po planDict
{
"Page_1" = {
};
"Page_2" = {
};
"Page_3" = {
};
}
(gdb) po pageOne
{
}
(gdb) po pageTwo
{
}
(gdb) po pageThree
{
}
任何帮助将不胜感激,谢谢。
答案 0 :(得分:4)
通过询问NSUserDefaults返回的字典将是一个不可变的字典,字典中的任何字典也是如此。
因此,设置不可变字典上的对象确实会引发SIGABRT错误,因为返回的对象不理解您发送给它的方法。
您将需要创建字典的可变副本,并为该字典中的每个包含字典创建一个可变副本。
希望能够排除您的错误。
答案 1 :(得分:1)
我认为真正的问题是保存字典,你保存了可变字典吗? 你被赋予了一个不可变的字典,所以你必须为它创建一个可变的副本。