Зачем беспокоиться об освобождении памяти в viewDidUnload и dealloc - PullRequest
2 голосов
/ 29 августа 2010

Разве эти методы не вызываются, когда приложение будет закрыто? Если так, то память все равно не будет очищена?

Ответы [ 4 ]

2 голосов
/ 29 августа 2010

Если у вас есть только одно представление, которое длится время работы приложения, тогда unload и dealloc в настоящее время даже не вызываются, поэтому эти методы фактически не используются и не нужны.

Однако , если вы когда-нибудь расширите это приложение, чтобы иметь представления и объекты, которые включаются и выключаются, то при нехватке памяти эти методы вполне могут быть вызваны для уменьшения объема памяти вашего приложения, так приложение не убивается за использование слишком большого количества памяти. Поэтому оставление их внутри (и их правильное кодирование для освобождения внутренних выделенных объектов и памяти malloc) для повторного использования в будущем считается хорошей практикой. Вот почему они поставляются с различными шаблонами Какао.

1 голос
/ 30 августа 2010

viewDidUnload вызывается только в ситуациях нехватки памяти. Вы хотите освободить весь объект, который вы создаете в viewDidLoad. Вы хотите соединить их. Вы все еще хотите освободить все в dealloc, так как viewDidUnload не будет вызываться, если в вашем приложении никогда не возникает ситуации с нехваткой памяти.

1 голос
/ 29 августа 2010

Разве эти методы не вызываются, когда приложение будет закрыто? Если так, то память все равно не будет очищена?

Это правда, что viewDidUnload и dealloc вызываются, когда приложение завершается, но это, конечно, не единственный раз. Очень важно правильно реализовать эти методы очистки, а также didReceiveMemoryWarning.

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

Точно так же, если ваш viewDidUnload не освобождает свои ресурсы, у вас может быть утечка памяти. Если представление используется несколько раз, при каждом вызове происходит утечка.

Тщательное управление памятью является более важным, чем когда-либо, с iOS 4, поскольку ваше приложение может оказаться в фоновом режиме, если пользователь нажмет кнопку «Домой». Это означает, что он может работать дольше, чем когда-либо, и поэтому вы будете повторно использовать одни и те же контроллеры представления, когда он вернется на передний план. Если ваше приложение не освобождает неиспользуемую память должным образом, она почти наверняка будет уничтожена системой.

0 голосов
/ 29 августа 2010

Имейте в виду, что у каждого класса, наследуемого от NSObject, есть свой dealloc, и поэтому, когда счетчик ссылок объекта достигает 0, вызывается его освобождение, а это означает, что память, принадлежащая этому объекту, будет лучше освобождена.

Точно так же viewDidUnload - это метод, который есть у каждого UIViewController, и он вызывается, когда основное представление, связанное с контроллером, больше не нужно, больше не видно, если вы хотите (вы можете думать о том, что оно вызывается, когда вы поп контроллер из стека навигации или переключение вкладки в контроллере вкладок). Для приложения и iPhone / iPod удобно не иметь объектов, принадлежащих виду вокруг, когда вид не отображается / активен / используется и т. Д.

Наконец, AppDelegate, как объект, имеет свой собственный метод dealloc, так что, возможно, из-за этого может возникнуть путаница.

...