Подтвердить что ты не робот

Что я должен делать в viewDidUnload?

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

//Отпустите все сохраненные подпункты основной вид.//например. self.myOutlet = nil;

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

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

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

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

4b9b3361

Ответ 1

Цель состоит в том, чтобы "сбалансировать" ваше управление подвью. Все, что вы создаете в 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, чтобы отказаться от владения этими точками или любыми другими относящимися к просмотру данными, которые вам больше не нужны.

Ответ 2

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

Ответ 3

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