предупреждения памяти ОС iPhone. Что Означают Различные Уровни?


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

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

спасибо,
Даг

3 85

3 ответа:

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

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


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

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

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

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

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

С OSMemoryNotification.h,

/*
** Threshold values for notifications
*/

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

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

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

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


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

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


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

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

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

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

  • реализовать applicationDidReceiveMemoryWarning: метод вашего приложения делегат.
  • переопределите метод didReceiveMemoryWarning в пользовательском режиме Для UIViewController подкласса.
  • регистрация для получения этот UIApplicationDidReceiveMemoryWarningnotificationnotification.

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

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

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


как правильно распределить память?

  • уменьшить использование объектов autoreleased : с автоматической ссылкой подсчитывая (ARC), лучше выделить / инициализировать объекты и пусть компилятор выпустит их для вас в соответствующее время. Это правда даже для временного объекты, которые в прошлом у вас могли быть autoreleased для того чтобы предотвратить их от жить за рамками современный метод.
  • наложить ограничения на размер ресурсов: избегайте загрузки большого файла ресурсов когда меньший будет делать. Вместо использования изображения с высоким разрешением, используйте тот, который имеет соответствующий размер для устройств на базе iOS. Если вы необходимо использовать большие файлы ресурсов, найти способы загрузки только части файл, который вам нужен в любой момент времени. Например, а чем загрузите весь файл в память, используйте функции mmap и munmap на карте части файла в память. Для большего информация о сопоставлении файлов в памяти.
  • избегайте неограниченных наборов задач: неограниченные наборы задач могут потребовать произвольно большой объем данных для вычисления. Если набор требует больше памяти, чем доступно, ваше приложение может быть не в состоянии завершить проведенные расчеты. Ваши приложения должны избегать таких наборов, когда это возможно и работа над проблемы с известными ограничениями памяти.