В чем разница между Dealloc и ViewDidunload?

Когда я должен освободить всю память, выделенную в моей программе?

Потому что у меня есть только метод viewDidLoad, где я занимаюсь своими делами. Должен ли я оставить Dealloc пустым, а очистку только в viewDidUnload?


person user605957    schedule 22.06.2011    source источник


Ответы (2)


'dealloc' используется, когда объект готов к освобождению (т. е. когда счетчик сохранения объекта становится равным 0). И viewDidUnload вызывается, когда представление выгружено, но оно не может быть освобождено сразу, так как ссылка на UIViewController все еще хранится некоторыми другими объектами.

мое личное предпочтение: для объектов, созданных с помощью «init», они освобождаются с помощью «dealloc», для объектов, созданных с помощью «viewDidLoad», они освобождаются с помощью «viewDidUnload».

person Walty Yeung    schedule 22.06.2011
comment
Не столько предпочтение, сколько необходимость. Имейте в виду, что -viewDidLoad может вызываться несколько раз, хотя между ними всегда будет вызов -viewDidUnload. Однако то, что вы создаете в -viewDidLoad, также должно быть очищено в -dealloc, поскольку -viewDidUnload нельзя вызывать до освобождения контроллера. - person Johan Kool; 22.06.2011

Как говорится в документации -viewDidUnload:

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

Как правило, контроллер представления хранит ссылки на объекты с помощью выхода, который представляет собой переменную или свойство, включающее ключевое слово IBOutlet и настраиваемое с помощью Interface Builder. Контроллер представления также может хранить указатели на объекты, которые он создает программно, например, в методе viewDidLoad. Предпочтительный способ отказаться от права собственности на любой объект (в том числе в торговых точках) — использовать соответствующий метод доступа, чтобы установить значение объекта равным нулю. Однако если у вас нет метода доступа для данного объекта, возможно, вам придется явно освободить объект.

Не упоминается, что -viewDidUnload позвонит -dealloc, не стоит на это полагаться.

person cxa    schedule 22.06.2011