Когда я должен освободить всю память, выделенную в моей программе?
Потому что у меня есть только метод viewDidLoad, где я занимаюсь своими делами. Должен ли я оставить Dealloc пустым, а очистку только в viewDidUnload?
Когда я должен освободить всю память, выделенную в моей программе?
Потому что у меня есть только метод viewDidLoad, где я занимаюсь своими делами. Должен ли я оставить Dealloc пустым, а очистку только в viewDidUnload?
'dealloc' используется, когда объект готов к освобождению (т. е. когда счетчик сохранения объекта становится равным 0). И viewDidUnload вызывается, когда представление выгружено, но оно не может быть освобождено сразу, так как ссылка на UIViewController все еще хранится некоторыми другими объектами.
мое личное предпочтение: для объектов, созданных с помощью «init», они освобождаются с помощью «dealloc», для объектов, созданных с помощью «viewDidLoad», они освобождаются с помощью «viewDidUnload».
-viewDidLoad
может вызываться несколько раз, хотя между ними всегда будет вызов -viewDidUnload
. Однако то, что вы создаете в -viewDidLoad
, также должно быть очищено в -dealloc
, поскольку -viewDidUnload
нельзя вызывать до освобождения контроллера.
- person Johan Kool; 22.06.2011
Как говорится в документации -viewDidUnload
:
Он вызывается в условиях нехватки памяти, когда контроллеру представления необходимо освободить свое представление и любые объекты, связанные с этим представлением, чтобы освободить память. Поскольку контроллеры представлений часто хранят ссылки на представления и другие объекты, связанные с представлениями, вы должны использовать этот метод, чтобы отказаться от владения этими объектами, чтобы можно было освободить память для них. Вы должны делать это только для объектов, которые вы можете легко воссоздать позже либо в вашем методе viewDidLoad, либо из других частей вашего приложения. Вы не должны использовать этот метод для раскрытия пользовательских данных или любой другой информации, которую нельзя легко воссоздать.
Как правило, контроллер представления хранит ссылки на объекты с помощью выхода, который представляет собой переменную или свойство, включающее ключевое слово IBOutlet и настраиваемое с помощью Interface Builder. Контроллер представления также может хранить указатели на объекты, которые он создает программно, например, в методе viewDidLoad. Предпочтительный способ отказаться от права собственности на любой объект (в том числе в торговых точках) — использовать соответствующий метод доступа, чтобы установить значение объекта равным нулю. Однако если у вас нет метода доступа для данного объекта, возможно, вам придется явно освободить объект.
Не упоминается, что -viewDidUnload
позвонит -dealloc
, не стоит на это полагаться.