Предупреждения памяти iPhone OS. Что означают разные уровни?

Что касается черного искусства управления памятью на устройствах iPhone OS: что означают разные уровни памяти. 1-й уровень? Уровень 2? Набирает ли диск 11?

Контекст: после обширного периода стресс-тестирования памяти, включая запуск моего приложения iPad с помощью приложения для плеера iPod, я склонен игнорировать случайные, но редкие предупреждения о памяти, которые я получаю. Мое приложение никогда не падает. Когда-либо. Мое приложение не содержит утечек. И, что ж, предупреждения мемов просто не кажутся важными.

Благодаря,
Doug

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

Предупреждения уровня памяти регистрируются SpringBoard. В качестве разработчика приложений вам не нужно заботиться об этом. Просто отвечать на -{application}didReceiveMemoryWarning достаточно.


Существует 4 уровня предупреждений (от 0 до 3). Они устанавливаются из наблюдателя памяти ядра и могут быть получены с помощью не-публичной функции OSMemoryNotificationCurrentLevel() .

 typedef enum { OSMemoryNotificationLevelAny = -1, OSMemoryNotificationLevelNormal = 0, OSMemoryNotificationLevelWarning = 1, OSMemoryNotificationLevelUrgent = 2, OSMemoryNotificationLevelCritical = 3 } OSMemoryNotificationLevel; 

Как запускаются уровни, не документируется. SpringBoard настроен на выполнение следующих действий на каждом уровне памяти:

  1. Предупреждение (не нормальное) – перезапуск или задержка автоматического перезапуска несущественных фоновых приложений, например Mail.
  2. Срочно – Закройте все фоновые приложения, например Safari и iPod.
  3. Критически и дальше – Ядро возьмет на себя ответственность, возможно, убив SpringBoard или даже перезагрузив компьютер.

Убивание активного приложения (jetsam) не обрабатывается SpringBoard, а launchd .

Из OSMemoryNotification.h ,

 /* ** Threshold values for notifications */ typedef enum { OSMemoryNotificationLevelAny = -1, OSMemoryNotificationLevelNormal = 0, OSMemoryNotificationLevelWarning = 1, OSMemoryNotificationLevelUrgent = 2, OSMemoryNotificationLevelCritical = 3 } OSMemoryNotificationLevel; 

totoal 5 уровней предупреждения памяти (-1,3).

Что касается предупреждения об уровне памяти, то ответ @ KennyTM превосходный.

Я хочу добавить несколько связанных вопросов, которые могут помочь PM и другим.


Что делать, если у вас есть предупреждение о уровне памяти?

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


Как наблюдать предупреждение уровня памяти?

Из http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html

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

UIKit предоставляет несколько способов получения предупреждений с низкой памятью, в том числе следующее:

  • Внедрите метод applicationDidReceiveMemoryWarning: ваш делегат приложения.
  • Переопределите метод didReceiveMemoryWarning в вашем пользовательском подclassе UIViewController.
  • Зарегистрируйтесь, чтобы получить UIApplicationDidReceiveMemoryWarningNotificationnotification.

Как уменьшить объем памяти вашего приложения?

  • Устранение утечек памяти.
  • Сделайте файлы ресурсов как можно меньшими.
  • Используйте Core Data или SQLite для больших наборов данных.
  • Загружайте ресурсы лениво.
  • Создайте свою программу, используя опцию Thumb.

Подробности на странице http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html


Как распределить память с умом?

  • Уменьшите использование автореализованных объектов . С автоматическим подсчетом ссылок (ARC) лучше выделять / инициализировать объекты и позволять компилятору выпускать их для вас в соответствующее время. Это справедливо даже для временных объектов, которые в прошлом вы могли бы автореализовать, чтобы предотвратить их существование за пределы текущего метода.
  • Накладывайте ограничения по размерам ресурсов . Избегайте загрузки большого файла ресурсов, если это сделает меньший. Вместо использования изображения с высоким разрешением используйте тот, который соответствует размерам для устройств на базе iOS. Если вы должны использовать большие файлы ресурсов, найдите способы загрузки только той части файла, которая вам нужна в любой момент времени. Например, вместо того, чтобы загружать весь файл в память, используйте функции mmap и munmap для отображения частей файла в и из памяти. Дополнительные сведения о сопоставлении файлов в памяти.
  • Избегайте неограниченных наборов проблем : для неограниченных наборов задач может потребоваться произвольно большой объем данных для вычисления. Если для набора требуется больше памяти, чем доступно, ваше приложение может оказаться неспособным завершить вычисления. Ваши приложения должны избегать таких наборов, когда это возможно, и работать над проблемами с известными ограничениями памяти.
  • Объясните эту реализацию malloc из книги K & R
  • Динамическое распределение массива объектов
  • std :: вектор и непрерывная память многомерных массивов
  • Можно ли программно определить размер массива C ++? А если нет, то почему?
  • Как я могу получить размер массива из указателя в C?
  • Где постоянные переменные хранятся в C?
  • Удалить , равное удалению?
  • Как инициализировать память новым оператором в C ++?
  • Как получить доступную память C ++ / g ++?
  • Динамический двумерный массив с указателем на указатель
  • Методы classа, которые создают новые экземпляры
  • Interesting Posts
    Давайте будем гением компьютера.