Ответ 1
Прежде всего, это только рекомендации, поэтому, если вы не думаете, что имеет смысл выпустить что-то в didReceiveMemoryWarning
, тогда не делайте этого. Но имейте в виду, что если ваше приложение является тем, которое вызывает предупреждение о памяти в первую очередь, оно в конечном итоге будет просто прекращено ОС.
Re (1): Критический и некритический - это ваш призыв. Только вы можете действительно определить, какие данные вы держите, что считаете критическими. Хотя это, вероятно, будет тесно связано с вашим (3), то есть что-то, что легко воссоздано, вероятно, не слишком критично.
Re (2): Я не думаю, что это утверждение относится к порядку вызовов. Как вы поняли, в общем случае viewDidUnload
будет вызван после didReceiveMemoryWarning
(так как didReceiveMemoryWarning
может вызвать вызов viewDidUnload
). Например, в viewDidUnload
будут выпущены ссылки на элементы пользовательского интерфейса из ниба. Поэтому не отпустите их в didReceiveMemoryWarning
.
Re (3): Если представление используется и, следовательно, не может быть выгружено, то да, очевидно, не обязательно имеет смысл освободить его в didReceiveMemoryWarning
. Тем не менее, на самом деле у вас могут быть экземпляры, в которых невозможно было выгрузить представление, но, как известно, оно не будет видимым (не очень нормальным), и в этом случае имеет смысл разгрузить его данные и воссоздать его, когда вид будет виден еще раз.
Кроме того, я согласен с замечанием "Вместо этого, вы должны рассмотреть...", это немного странно, но опять же я думаю, что пункт рекомендации по выпуску данных в didReceiveMemoryWarning
проистекает из того факта, что если вы получаете эти предупреждения, то ваше собственное приложение может оказаться под угрозой прекращения. Таким образом, хотя в настоящее время существует вероятность того, что viewDidUnload
, вероятно, всегда вызывается как результат предупреждения о памяти, что может не всегда иметь место в будущем, и поэтому концептуально имеет смысл высвобождать данные в didReceiveMemoryWarning
. В didReceiveMemoryWarning
вы ЗНАЕТЕ, что есть давление памяти, в viewDidUnload
вы не можете. Таким образом, хотя верно, что данные будут тогда дороги для воссоздания, это может быть лучше, чем прекратить ваше приложение. Для пользователя это будет выглядеть так, как если бы приложение разбилось.
Мой собственный подход к этим методам, как правило, таков:
- viewDidUnload - освободить любые ссылки на элементы пользовательского интерфейса, загруженные из наконечника. Отпустите все элементы пользовательского интерфейса, созданные мной в
viewDidLoad
. - didReceiveMemoryWarning - освободить любые данные, которые используются в представлении пользовательского интерфейса, который я могу восстановить, если/когда
viewDidLoad
вызывается снова (или какое-либо другое конкретное событие). НЕ выпускайте ничего, что невозможно воссоздать.