SIGABRT после установки объекта в NSMutableDictionary - PullRequest
1 голос
/ 03 апреля 2012

В теме все сказано. У меня есть словарь словарей (да, это словарь!), Хранящийся в NSUserDefaults. По какой-то странной причине я получаю SIGABRT на main.m сразу после установки объекта в словарь. Вот код:

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"];. Когда я перешагнул через него, он просто рухнул (SIGABRT на main.m).

Вот журнал прямо перед сбоем:

(gdb) po planDict
{
  "Page_1" =     {
  };
  "Page_2" =     {
  };
  "Page_3" =     {
  };
}
(gdb) po pageOne
{
}
(gdb) po pageTwo
{
}
(gdb) po pageThree
{
}

Любая помощь будет оценена, спасибо.

Ответы [ 2 ]

4 голосов
/ 03 апреля 2012

Словарь, возвращаемый с запросом NSUserDefaults, будет неизменным, как и любые словари в словарях и т. Д.

Таким образом, установка объекта в неизменном словаре действительно вызовет ошибку SIGABRT, так как возвращаемый объект не понимает метод, который вы ему отправили.

Вместо этого вы захотите создать изменяемую копию словаря и сделать изменяемую копию каждого содержащегося в нем словаря.

Надеюсь, это решит вашу ошибку.

1 голос
/ 03 апреля 2012

Я думаю, что реальная проблема заключается в сохранении словарей, вы сохранили изменяемый словарь?Вам дают неизменный словарь, поэтому вы должны создать изменяемую копию для него.

...