iPhone - когда вызывается dealloc для viewcontroller? - PullRequest
24 голосов
/ 23 февраля 2009

Я использую UINavigationController для перемещения между представлениями. Когда я перемещаюсь назад и вперед в представлениях, память, используемая моим приложением, продолжает увеличиваться. Поместив операторы NSLog в метод dealloc всех viewcontrollers, я заметил, что он вызывается только для некоторых viewcontrollers, а не для всех, которые были выведены.

Например, это последовательность, в которой выталкиваются представления.

Теперь в viewcontroller3, если я делаю popToViewController: mainController, dealloc вызывается только для viewcontroller3. Он не вызывается для viewcontroller1 и 2.

Может кто-нибудь, пожалуйста, скажите мне, почему это происходит.

Нашел проблему. Метод dealloc не вызывался, если какая-либо из ссылок, хранящихся в viewcontroller, все еще находилась в памяти. В моем случае это был объект MPMoviePlayerController, который не был освобожден в viewcontroller1 и viewcontroller2.

Ответы [ 4 ]

13 голосов
/ 23 февраля 2009

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

Если вы вернетесь к бургеру, вы снимаете верхнюю плюшку (popViewController: вызывает метод dealloc для представления, которое выскочило). Если вы хотите вернуться к нижней булочке, вам нужно выложить гамбургер (dealloc вызывается каждый раз, когда открывается представление).

не уверен, почему при поп-корне не будет вызван dealloc второго контроллера вида ..

гм

0 голосов
/ 25 августа 2010

использовать как [self.navigationController popToRootViewControllerAnimated: YES]; Это сработало для меня ... вызывает все методы dealloc моих 10 контроллеров представления

0 голосов
/ 12 ноября 2009

Вам также следует помнить, что не всегда гарантированно выполняется dealloc.

0 голосов
/ 11 марта 2009

, когда вы перемещаетесь по своим контроллерам, должна быть необходимость написать эту строку после pushviewcontroller, [viewControllername release]; тогда будет вызываться каждый метод Dealloc для viewcontroller:)

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