Предупреждения памяти iPhone OS. Что означают разные уровни? - PullRequest
85 голосов
/ 26 мая 2010

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

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

Спасибо
Дуг

Ответы [ 3 ]

193 голосов
/ 26 мая 2010

Предупреждения об уровне памяти регистрируются 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. Критическое и не только: ядро ​​вступит во владение, возможно, убив SpringBoard или даже перезагрузившись.

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

96 голосов
/ 26 мая 2010

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

12 голосов
/ 29 апреля 2013

С OSMemoryNotification.h ,

/*
** Threshold values for notifications
*/

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

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

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

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


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

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


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

С 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


Как разумно выделить память?

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