将对象设置为NSMutableDictionary后的SIGABRT

时间:2012-04-03 07:25:31

标签: iphone objective-c ios nsmutabledictionary

主题说明了一切。我有一个存储在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
{
}

任何帮助将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:4)

通过询问NSUserDefaults返回的字典将是一个不可变的字典,字典中的任何字典也是如此。

因此,设置不可变字典上的对象确实会引发SIGABRT错误,因为返回的对象不理解您发送给它的方法。

您将需要创建字典的可变副本,并为该字典中的每个包含字典创建一个可变副本。

希望能够排除您的错误。

答案 1 :(得分:1)

我认为真正的问题是保存字典,你保存了可变字典吗? 你被赋予了一个不可变的字典,所以你必须为它创建一个可变的副本。