почему я вижу некоторый код, в котором вещи выпускаются в viewDidUnload, а не в dealloc? - PullRequest
0 голосов
/ 08 июня 2011

Все учебники, которые я сделал, говорят, что я установил nil в viewDidUnload, а затем выпустил в dealloc. Однако мне говорят, что это приведет к утечке памяти, так как viewDidUnload вызывается перед dealloc, и поэтому я не могу выпустить что-либо, для которого установлено значение nil.

Может кто-нибудь помочь уточнить?

Ответы [ 2 ]

4 голосов
/ 08 июня 2011

Если вы создаете объект (с alloc и init) в viewDidLoad, то вы должны release его в viewDidUnload.Причина в том, что иногда viewDidUnload вызывается для сохранения памяти, но dealloc не вызывается.Затем, позже, viewDidLoad может быть вызван снова.В общем, освободите все, что вы выделяете в обратном методе, например,

Если вы выделите объект в init, то отпустите его в dealloc.

Если вы выделите объект в viewDidLoad, затем отпустите его в viewDidUnload.

Если вы выделите объект в viewWillAppear (или viewDidAppear), то отпустите его в viewWillDisappear (или viewDidDisppear).

0 голосов
/ 08 июня 2011

Посмотрите на ответ @ Sean в этом предыдущем ТАК вопрос . Он ясно заявляет цель выпуска в viewDidUnload

Одна из наиболее важных причин реализуя это то, что UIViewController подклассы обычно также содержат ссылки на различные подпредставления в представлении иерархия. Эти свойства могут иметь был установлен через IBOutlets, когда загрузка с кончика или программно внутри -loadView, для экземпляр.

Дополнительное владение подпредставлениями UIViewController означает, что даже когда его вид удален из просмотреть иерархию и отпустить, чтобы сохранить память, через которую проходят подпредставления также выпущен по мнению, они будут на самом деле не быть освобожден, потому что сам UIViewController до сих пор содержит свои собственные выдающиеся сохранения ссылки на эти объекты, а также. Выпуск UIViewController's дополнительное владение этими объектами гарантирует, что они будут освобождены как хорошо, чтобы освободить память.

Объекты, которые вы отпускаете здесь: обычно воссоздается и устанавливается снова, когда вид UIViewController является перезагружен, либо из Nib или через реализацию -loadView.

Также обратите внимание, что UIViewController's к моменту метод называется.

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