Где освободить объект? dealloc или ViewDidUNload - PullRequest
1 голос
/ 10 июля 2010

Когда нам нужно освободить объект, где это сделать, в методе dealloc или в ViewDidUnload для viewController?что было бы лучше?

Я думаю, что viewDidUnload будет лучше, потому что, как только контроллер представления будет выгружен, объекты будут освобождены.А в случае dealloc из документации

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

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

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

Если мое понимание неверно,Пожалуйста, поправьте меня.

Спасибо и всего наилучшего, Кришнан

Ответы [ 2 ]

6 голосов
/ 10 июля 2010

Да, ваше понимание неверно.

Во-первых, не имеет значения, что происходит при выходе из приложения, потому что ОС все равно освободит всю память, выделенную вашему приложению. Не вызывать Deloloc при завершении работы приложения - это просто способ Apple ускорить процесс.

Во-вторых, не * view controller выгружается при вызове viewDidUnload, а только его view . Контроллер представления остается в живых, пока он не будет освобожден.

В viewDidUnload вы должны освободить те объекты, которые являются частью представления, и все, что может и будет воссоздано в viewDidLoad (потому что viewDidLoad будет вызываться снова, когда контроллеру представления необходимо воссоздать его представление ). Это включает в себя все ваши выходы. Вы также должны установить эти переменные на nil, чтобы избежать их перевыпуска.

Поскольку в dealloc вы должны освободить все объекты, которые сохраняет ваш контроллер представления, включая те, которые вы включили в viewDidUnload.

Взгляните на пример кода Apple, чтобы узнать, как Apple это делает.

1 голос
/ 06 февраля 2013

Вы должны принять во внимание, что из iOS 6

viewDidUnload

НИКОГДА не вызывается, как от Apple:

Priorдо iOS 6, когда появлялось предупреждение о нехватке памяти, класс UIViewController очищал свои представления, если он знал, что может перезагрузить или воссоздать их позже.В этом случае он также вызывает методы viewWillUnload и viewDidUnload, чтобы дать вашему коду возможность отказаться от владения всеми объектами, связанными с вашей иерархией представления, включая объекты, загруженные из файла nib, объекты, созданные в вашем методе viewDidLoad, и объекты, созданныелениво во время выполнения и добавлен в иерархию представления.В iOS 6 представления никогда не удаляются, и эти методы никогда не вызываются.Если ваш контроллер представления должен выполнять определенные задачи при нехватке памяти, он должен переопределить метод didReceiveMemoryWarning.

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