iPhone - Как бороться с нехваткой памяти - PullRequest
2 голосов
/ 22 января 2012

Когда приложение получает предупреждающее сообщение о нехватке памяти, могут возникнуть 3 ситуации:

  1. Ваше приложение только что было запущено, и пользователь не сделал ничего особенного
  2. приложениеработает и существует текущий контекст
  3. приложение находится в фоновом режиме с некоторым запущенным контекстом

Так что, когда вы получаете это сообщение, вы должны освободить память ... Но где?И как?

Я понимаю, что:

  1. initWith ..... должны установить статические значения по умолчанию.
  2. viewDidLoad должен загрузить любой нестатический объект
  3. didReceiveMemoryWarning должен освободить эти нестатические объекты
  4. Я не вижу, что можно / нужно сделать в viewDidUnload ...

Я предполагаю, что некоторые сохраненные значения должны быть где-то равны нулю ... в didReceiveMemoryWarning?

И что должно быть сделано с активным контекстом (положением вещейэкран, отображаемый текст, ...) поэтому, когда снова вызывается viewDidLoad, эти вещи появляются снова, как перед вызовом memoryWarning?

Я имею в виду, представьте 2 сценария:

Сценарий 1

  1. вы работаете над чем-то ... вы написали какой-то текст в поле, не сохранили его, открыли другой вид, переместили вид на экран.
  2. Вы отправляете приложение в фоновом режиме.
  3. Затем в приложение отправляется предупреждение о памяти.
  4. После этого пользователь отправляет приложение на передний план: оно должно отображать вещи, как будто они были включены.выйти, в текущем представлении, как в предыдущих представлениях, но если все былокак вы можете это сделать?

Сценарий 2

  1. вы работаете над чем-то ... вы написали какой-то текст в поле,не сохранил его, открыл другой вид, переместил вид на экран.
  2. Затем в приложение отправляется предупреждение о памяти.
  3. Вы не хотите терять то, что находится на виде,ни то, что было в предыдущем представлении.Вы не хотите, чтобы экран мерцал из-за функции выпуска / перезагрузки.Как вы справляетесь с этим?

Так что, когда появляются эти предупреждения памяти, есть ли у вас другой выбор, кроме записи чего-либо на диск, чтобы отобразить их позже?

А когда вы снова загрузите их?У меня есть viewController, который загружает (viewDidLoad), получает memoryWarning, выгружает (viewDidUnload), но при возвращении к нему viewDidLoad больше не вызывается?Делать это нужно в viewWillAppear?Должен ли я думать, что в любое время, когда срабатывает viewWillAppear, я могу предположить, что загружены все элементы, которые должны отображаться на нем?

Любая помощь, даже с ценными ссылками, будет великолепна!* Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 22 января 2012

Рассмотрите альтернативы вашим сценариям.Ваше приложение может быть убито, если оно не освободит достаточно памяти, что будет еще более раздражающим для пользователя.Можно выбрать возможность мерцания текущего дисплея из-за потери ценных данных пользователя.

1 голос
/ 22 января 2012

Моя идея заключается в том, что при получении предупреждением о нехватке памяти вызывается два метода:

didReceiveMemoryWarning // in your NSObjects

и

applicationDidReceiveMemoryWarning // in your app delegate

, а затем, если вы хотите освободить память, этометоды для рассмотрения.

Что касается того, что вы можете сделать там ... Ну ... Подумайте о том, что Xcode предлагает:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
    /*
     Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later.
     */
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

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

Что касается ваших 2 сценариев, я вижу возможную ошибку при рассмотрении того, для чего предназначено предупреждение о памяти.Это способ лечения чрезвычайных ситуаций, а не обычный способ управления памятью.Разработчики должны думать о хорошей архитектуре памяти и сохранять данные всякий раз, когда это возможно.

В сценарии 1 сохраняйте свои данные, когда приложение отправляется в фоновый режим.

applicationDidEnterBackground

В сценарии 2 сохраняйте своиданные при открытии нового представления.

Надеюсь, это имеет смысл ...

...