Проблема сбоя приложения в iPhone - PullRequest
0 голосов
/ 07 сентября 2010

Я использовал NSMutable Dictionary и NSMutable Array.Данные должны храниться и извлекаться из plist (Каталог документов) с использованием NSArray из NSMutable Dictionary.

     Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray removeObjectAtIndex:]: mutating method sent to immutable object' 

Пожалуйста, сообщите мне, почему это произошло?.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 07 сентября 2010

Это может помочь, если вы отправите точный код, который вызывает. Я полагаю, что пока вы используете NSMutableDictionary, вызов valueForKey: возвращает вам неизменяемый NSArray, и вы думаете, что он возвращает вам экземпляр NSMutableArray. Обратите внимание, что изменяемые массивы и словари позволяют вам управлять коллекцией элементов внутри них, но не гарантируют, что сами эти элементы являются изменяемыми. Например, если вы посмотрите Руководство по программированию списка свойств: чтение и запись данных списка свойств , вы увидите следующий пример:

Если вы загрузите список свойств с этот звонок:

NSMutableArray * ma = [NSMutableArray arrayWithContentsOfFile:xmlFile];

ma является изменяемым массивом с неизменяемым словари в каждом элементе. Каждый ключ и каждое значение в каждом словаре неизменны.

Если вам нужен явный контроль над изменчивостью объектов на каждом уровне, используйте propertyListFromData:mutabilityOption:format:errorDescription:

Вы также можете создать явную копию NSMutableArray из NSArray, полученного из NSMutableDictionary.

0 голосов
/ 07 сентября 2010

Предположим, [something dictionaryValue] возвращает неизменный словарь, и вам нужна изменяемая версия этого словаря. Недостаточно сказать:

NSMutableDictionary *d = [something dictionaryValue];

Это просто говорит компилятору, что d - это NSMutableDictionary, но на самом деле это тот же неизменный словарь, который вы получили из [something dictionaryValue]. Вместо этого вам нужно создать новую изменчивую копию словаря:

NSMutableDictionary *d = [NSMutableDictionary dictionaryWithDictionary:
                                              [something dictionaryValue]];

Аналогично, используйте [NSMutableArray arrayWithArray:...] для массивов.

0 голосов
/ 07 сентября 2010

вы сказали, что извлекаете массив как NSArray и не приводите его к NSMutableArray, прежде чем пытаться удалить объект для него. Это вызывает ошибку, поскольку вы не можете удалить объект из NSArray

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...