didReceiveMemoryWarning и viewDidUnload - PullRequest
       15

didReceiveMemoryWarning и viewDidUnload

11 голосов
/ 04 декабря 2010

Из руководства по программированию контроллера Apple View / Эффективное управление памятью;

didReceiveMemoryWarning

Используйте этот метод для освобождения всех некритических пользовательских структур данных, связанных с вашим представлениемконтроллер.Хотя вы не будете использовать этот метод для освобождения ссылок для просмотра объектов, вы можете использовать его для выпуска любых связанных с представлением структур данных, которые вы еще не выпустили в своем методе viewDidUnload.(Сами объекты представления всегда должны быть освобождены в методе viewDidUnload.)

viewDidUnload

Вы можете использовать метод viewDidUnload для освобождения любых данных, которые зависят от вида иэто может быть воссоздано достаточно легко, если представление снова загружается в память.Если воссоздание данных может занять слишком много времени, вам не нужно освобождать соответствующие объекты данных здесь.Вместо этого вам следует рассмотреть возможность освобождения этих объектов в вашем методе didReceiveMemoryWarning.

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/BasicViewControllers/BasicViewControllers.html

  1. Для didReceiveMemoryWarning рекомендуется освободить некритические структуры данных.,Итак, что критично, а что не критично?

  2. Кроме того, в нем говорится о том, чтобы выпустить то, что мы еще не выпустили в viewDidUnload.Но когда появляется предупреждение о памяти, вызывается didReceiveMemoryWarning и представление может быть выгружено, тогда вызывается viewDidUnload.Итак, речь идет о перемещении этих кодов в метод предыдущего события (didReceiveMemoryWarning) или я что-то упускаю из порядка событий?

  3. Для viewDidUnload рекомендуется позаботиться о легко воссоздание данных при перезагрузке представления.Итак, если представление используется и не может быть выгружено, почему мы будем выпускать трудоемкие данные в didReceiveMemoryWarning?После того, как эти данные выпущены, когда пользователь пытается что-то сделать в текущем представлении, их загрузка тоже будет занимать много времени.

Ответы [ 2 ]

16 голосов
/ 04 декабря 2010

Прежде всего, это всего лишь рекомендации, поэтому, если вы не думаете, что имеет смысл выпускать что-то в didReceiveMemoryWarning, не делайте этого.Но имейте в виду, что если ваше приложение в первую очередь вызывает предупреждение о памяти, то оно в конечном итоге просто будет остановлено ОС.

Re (1): Критическое против некритического - этополностью ваш звонок.Только вы действительно можете определить, какие данные у вас есть, которые вы считаете критическими.Хотя это, вероятно, будет тесно связано с вашим (3), то есть что-то, что легко воссоздается, вероятно, не слишком критично.

Re (2): Я не думаю, что утверждение относится кпорядок звонков.Как вы уже поняли, в общем случае viewDidUnload будет вызываться после didReceiveMemoryWarning (поскольку didReceiveMemoryWarning может вызвать viewDidUnload для вызова).Например, в viewDidUnload можно освободить ссылки, хранящиеся в элементах пользовательского интерфейса, из кончика.Так что не выпускайте их также в didReceiveMemoryWarning.

Re (3): Если представление используется и, следовательно, не может быть выгружено, тогда да, очевидно, это не обязательно имеет большой смыслотпустите его в didReceiveMemoryWarning.Однако у вас могут быть случаи, когда представление не может быть выгружено, но известно, что оно невидимо (не очень нормально), и в этом случае может иметь смысл выгрузить его данные и воссоздать его, когда представление снова станет видимым..

Кроме того, я согласен с тем, что замечания "Вместо этого вы должны учитывать ..." немного странные, но опять же я думаю, что смысл рекомендовать выпуск данных в didReceiveMemoryWarning проистекает из того факта, что есливы получаете эти предупреждения, тогда ваше собственное приложение может оказаться под угрозой закрытия.Таким образом, хотя в настоящее время viewDidUnload, вероятно, всегда вызывается как результат предупреждения о памяти, это не всегда может иметь место в будущем, и поэтому концептуально имеет смысл выпускать данные в самом didReceiveMemoryWarningdidReceiveMemoryWarning вы ЗНАЕТЕ, что есть давление памяти, в viewDidUnload вы не можете.Так что, хотя правда, что данные потом будут воссозданы, это может быть лучше, чем прекращение работы вашего приложения.Для пользователя это будет выглядеть так, как будто приложение зависло.

Мой личный подход к этим методам обычно таков:

  • viewDidUnload - освобождает любые ссылки на элементы пользовательского интерфейса, загруженные из пера.,Освободить все элементы пользовательского интерфейса, которые я сам создал в viewDidLoad.
  • didReceiveMemoryWarning - освободить любые данные, которые используются в представлении пользовательского интерфейса, которые я могу воссоздать, если / когда viewDidLoad вызывается снова (или в каком-либо другом приложении)конкретное событие).НЕ выпускайте ничего, что я не могу воссоздать.
1 голос
/ 06 декабря 2010

Приложения, которые я создаю, интенсивно работают с графикой, как в плане макета Chrome, так и в изображениях, связанных с данными, которые я загружаю и отображаю.

Мои didReceiveMemoryWarning методы ВСЕ оопределение, какие изображения я храню в памяти, но которые в данный момент не отображаются, и удаление их из памяти.Другим примером является то, что перед отображением изображения необходимо проверить, все ли оно вокруг, и, если нет, загрузить его лениво.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...