UIViewController не выпускает подпредставления, когда dealloc (используя ARC) - PullRequest
1 голос
/ 13 января 2012

У меня возникла странная (не?) Проблема с UIViewController. Похоже, что контроллер не выпускает свои подпредставления, когда он освобожден. Я поместил сообщения NSLog во все методы dealloc подпредставления, а также в контроллер представления. Контроллер представления dealloc вызывается, а подпредставление - нет. Однако, если я затем помещаю другой экземпляр этого контроллера представления в стек навигации, оказывается, что все подпредставления предыдущего экземпляра затем освобождаются (я получаю кучу сообщений NSLog в консоли, сообщая мне об этом). Я проверил, и у меня нет отдельной ссылки на пользовательский контроллер представления в представительном контроллере представления (тот, который выполняет pushing).

Одна маленькая (может быть) деталь: пользовательский контроллер представления получает блок, который хранит, а затем выполняет перед извещением. Тем не менее, я отправил ноль к нему, и я получаю такое же поведение. Кроме того, представительный контроллер представления выполняет освобождение при извлечении из стека, поэтому цикл сохранения не сохраняется.

Кроме того, я попытался явно освободить каждое представление в методе dealloc пользовательского контроллера представления. Такое же поведение.

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

Моя проблема в том, что это действительно утечка памяти (из всех этих подпредставлений); хотя утечка не складывается, это все еще утечка.

Ответы [ 3 ]

7 голосов
/ 14 января 2012

Хорошо, это стыдно.Я обнаружил проблему в другом классе (называемом ViewDef), который по неосторожности использовал в качестве класса коллекции.Это был быстрый и грязный способ отслеживать мои подпредставления, когда я впервые узнал некоторые анимации (несколько месяцев назад).ViewDef хранит информацию о фрейме / шрифте / цвете / и т. Д., Полученную из базы данных, поэтому было удобно хранить виды при вычислении анимации (между ориентациями).Эти ViewDef были сохранены моей моделью и разосланы, поэтому, конечно, представления также были сохранены (и позже заменены другим контроллером представления).В любом случае, я забыл вставить предупреждение в мой код, чтобы исправить это позже.

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

0 голосов
/ 13 января 2012

Одна вещь, которую нужно попробовать, это убедиться, что все ваши делегаты subviews установлены в nil.

0 голосов
/ 13 января 2012

вы можете попытаться установить для подпредставлений значение nil в методе viewDidUnload, возможно, это поможет

...