Цель-C: Сохранение NSDictionary внутри автоматически выпущенного NSDictionary - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть большой NSDictionary с меньшим NSDictionary внутри.Я хочу автоматически выпустить более крупный и сохранить второй.У меня есть этот код в моем методе init:

// Autoreleased stage dictionary
NSString *plistPath = [[NSBundle mainBundle] pathForResource:map ofType:@"plist"];
NSDictionary *mapDict = [NSDictionary dictionaryWithContentsOfFile:plistPath];

// Owned items
citiesDictionary = [[mapDict objectForKey:@"Cities"] retain];

townsDictionary объявлен в интерфейсе класса как:

NSDictionary *citiesDictionary;

ЕслиЯ пытаюсь освободить townsDictionary в dealloc, используя следующую строку:класс, содержащий townsDictionary.Я признаю, что mapDict освобождается в конце init.Влияет ли это освобождение на cityDictionary, хотя я и назвал для него retain?

Если так, как я могу сохранить меньший словарь при освобождении большего, содержащего словарь?Я пробовал разные вещи при назначении townsDictionary, но, похоже, ничего не работает правильно.Некоторые из подходов, которые я пробовал:

citiesDictionary = [[mapDict objectForKey:@"Cities"] copy];

и

citiesDictionary = [NSDictionary initWithDictionary:[mapDict objectForKey:@"Cities"]];

и даже

 citiesDictionary = [NSDictionary initWithDictionary:[[mapDict objectForKey:@"Cities"] copy]];

Любая помощь приветствуется.Спасибо.

Ответы [ 3 ]

1 голос
/ 13 апреля 2011

Вы переиздавали городской указатель где-то, видя, что вы уже вызвали retain в методе init. Карта dict освободит ваш citydictionary только один раз, когда он автоматически выпущен, но не отменит сохранение, которое вы сделали в методе init.

Вы должны попытаться проверить другие ваши методы на предмет заявления о выпуске в вашем словаре или попросить статический анализатор сообщить вам.

1 голос
/ 13 апреля 2011

Скопировать словарь в citiesDictionary.

NSString *plistPath = [[NSBundle mainBundle] pathForResource:map ofType:@"plist"];
NSDictionary *mapDict = [NSDictionary dictionaryWithContentsOfFile:plistPath];
citiesDictionary = [[mapDict objectForKey:@"Cities"] copy];

Теперь вы можете быть уверены, что у вас есть копия словаря, даже если содержащий объект может быть освобожден в любой момент.Не забудьте затем также впоследствии отпустить надёжный код cityDictionary.

При использовании copy обратите внимание, что вы всегда получите неизменный NSDictionary, даже если исходный объект был NSMutableDictionary.Используйте mutableCopy, чтобы получить NSMutableDictionary, если необходимо.

0 голосов
/ 14 апреля 2011

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

Это была моя полная ошибка: я вставил в класс NSMutableDictionary, связанный с townsDictionary, с ошибкой в ​​управлении памятью и освободил эту другую вещьприводил к повреждению памяти.

Теперь оба параметра

citiesDictionary = [[mapDict objectForKey:@"Cities"] release];

и

citiesDictionary = [[mapDict objectForKey:@"Cities"] copy];

работают отличнохорошо.

PS .: Владыки StackOverflow: Учитывая, что решение проблемы было совершенно не связано с основным вопросом, я должен пойти и проголосовать за этот вопрос для удаления, или оставить его для справки?

...