Почему мой словарь выпущен в NSArray? - PullRequest
1 голос
/ 25 сентября 2011

У меня есть tableviewcontroller, который хранит объекты словаря в массиве, когда выбирается строка, я помещаю новый контроллер представления в стек навигации и передаю объект словаря из массива в его инициализаторе, объект словаря будет сохранен в свойстве нового контроллера представления. Когда я возвращаюсь обратно к своему контроллеру таблицы, я освобождаю объект словаря в dealloc контроллера представления. Но когда я прокручиваю вниз / назад в моем tableviewcontroller, словарь, который был передан в контроллер представления, освобождается в массиве tableviewcontroller, и программа вылетает с сообщением:

BreakdanceSource [1351: 607] * Завершение работы приложения из-за необработанного исключения «NSUnknownKeyException», причина: «[valueForUndefinedKey:]: этот класс не соответствует значению ключа, кодирующему заголовок ключа. '

Когда я удаляю [словарь выпуска] из функции dealloc контроллера представления, программа работает и не падает! Это странно, потому что я думал, что массив также сохраняет владение своими объектами, поэтому словарь не должен был быть освобожден.

Почему я не могу освободить объект словаря в моем контроллере представления? (Я удалил [выпуск словаря] сейчас в dealloc, и программа работает, но у меня не будет утечки памяти?)

Я пробовал это до сих пор!:

imageshack.us / photo / my-images / 813 / screenshot20110926at610.png Я использовал инструмент зомби, и это мой результат! Чего я не получаю, так это того, что до того, как в моем контроллере представления не произойдет разлочка, счетчик сохранения равен 1, что должно было быть 2. Поскольку массив в tableviewcontroller должен иметь словарь, а в контроллере моего представления есть свойство @ свойство (сохранить) NSDictionary * media. Я не знаю, где будет выпущен мой словарь, потому что теперь он выпускается только в dealloc контроллера вида

Я также пытался изменить свойство @property (retain) на @property NSDictionary * media, затем я использую media = [infoDictionary retain], и оно не вылетает ... мое свойство (retain) не сохраняло его?

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Да, вы должны освобождать этот объект где-то еще, попробуйте запустить NSZombie , чтобы подтвердить это.

1 голос
/ 25 сентября 2011

Да NSMutableArray увеличивает количество сохраняемых объектов, которые добавляются к нему, и соответственно уменьшает количество сохраняемых объектов при отпускании NSMutableArray. Это не мешает чему-то еще уменьшать счет удержания до точки высвобождения объектов. Итак, должен быть еще один выпуск / авто-релиз объекта.

Используйте инструмент «Распределение инструментов», установите параметр «Сохранить счетчик», найдите объект, и вы увидите, где происходит дополнительный выпуск. См. этот SO-ответ для получения информации об использовании Инструментов таким образом.

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