Что именно я должен делать в viewDidUnload? - PullRequest
20 голосов
/ 14 февраля 2010

Я обычно выпускаю свои вещи в -dealloc, и теперь в iPhone OS 3.0 появился этот забавный метод -viewDidUnload, где они говорят:

// Освобождение любых сохраненных подпредставлений основной вид. // например self.myOutlet = ноль;

Так что -viewDidUnload вызывается, когда представление контроллера представления было удалено из памяти. И если у меня есть подпредставления, прикрепленные к основному виду контроллера представления, я должен выпустить этот материал только ЗДЕСЬ, но также не в -dealloc?

Это сбивает с толку. Кроме того, что если -dealloc заставляет представление быть выгруженным (освобожденным)? Опять же, он будет вызывать -viewDidUnload?

Я понимаю разницу, что -viewDidUnload только для случая, когда само представление убивается, но контроллер представления остается в памяти. И -dealloc для случая, когда все это уходит в мусор.

Может быть, кто-то может устранить путаницу.

Ответы [ 3 ]

37 голосов
/ 14 февраля 2010

Намерение здесь состоит в том, чтобы "сбалансировать" ваше управление подпредставлением. Все, что вы создаете в viewDidLoad, должно быть выпущено в viewDidUnload. Это облегчает отслеживание того, что должно быть выпущено где. В большинстве случаев ваш dealloc метод является зеркальным отражением вашего init метода, а ваш viewDidUnload будет зеркальным отображением вашего viewDidLoad метода.

Как вы указали, методы viewDid ... должны использоваться, когда само представление загружается и выгружается. Это позволяет использовать шаблон, в котором контроллер представления остается загруженным в память, но само представление может быть загружено и выгружено при необходимости:

init
viewDidLoad
viewDidUnload
viewDidLoad
viewDidUnload
...
dealloc

Конечно, выпускать вещи в вашем методе dealloc также не повредит, если вы установите их в nil, когда вы отпустите их в viewDidUnload.

Следующая цитата из раздела «Управление памятью» в документации Apple UIViewController описывает ее более подробно:

... в iPhone OS 3.0 и более поздних версиях метод viewDidUnload может быть более подходящим местом для большинства потребностей.

Когда появляется предупреждение о нехватке памяти, класс UIViewController очищает свои представления, если он знает, что может перезагрузить или воссоздать их позже. Если это происходит, он также вызывает метод viewDidUnload, чтобы дать вашему коду возможность отказаться от владения любыми объектами, связанными с вашей иерархией представления, включая объекты, загруженные с помощью файла nib, объекты, созданные в вашем методе viewDidLoad, и объекты, созданные на время выполнения и добавлено в иерархию представлений. Как правило, если ваш контроллер представления содержит выходы (свойства или необработанные переменные, содержащие ключевое слово IBOutlet), вы должны использовать метод viewDidUnload, чтобы отказаться от владения этими выходами или любыми другими данными, относящимися к представлению, которые вам больше не нужны.

3 голосов
/ 14 февраля 2010

Как вы говорите, viewDidUnload будет вызываться, если self.view = nil, это обычно происходит, если вы получаете предупреждение о памяти. В этом методе вы должны освободить любое подпредставление mainview, которое может быть легко создано с помощью метода .xib или loadView. Вы должны освободить любой объект данных, если вы создадите их в viewDidload или loadView и т. Д., Поскольку эти методы будут вызываться снова для представления представления пользователю, эти данные могут быть легко воссозданы.

0 голосов
/ 14 февраля 2010

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

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