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

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

//Выпустите любые сохраненные подпредставления основного представления.//, например, self.myOutlet = ноль;

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

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

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

Возможно, кто-то может разрешить беспорядок.

20
задан dontWatchMyProfile 14 February 2010 в 17:19
поделиться

3 ответа

Цель состоит в том, чтобы «сбалансировать» управление вложенными представлениями. Все, что вы создаете в 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, чтобы дать вашему коду возможность отказаться от владения любыми объектами, которые связаны с вашей иерархией представления, включая объекты, загруженные с файлом пера, объекты, созданные в вашем методе viewDidLoad, и объекты, созданные лениво в время выполнения и добавлен в иерархию представлений. Как правило, если ваш контроллер представления содержит выходы (свойства или необработанные переменные, содержащие ключевое слово IBOutlet), вы должны использовать метод viewDidUnload, чтобы отказаться от владения этими выходами или любыми другими данными, связанными с представлением, которые вам больше не нужны.

37
ответ дан 29 November 2019 в 23:52
поделиться

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

0
ответ дан 29 November 2019 в 23:52
поделиться

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

3
ответ дан 29 November 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: