Уровень предупреждения памяти в приложении DidReceiveMemoryWarning - PullRequest
4 голосов
/ 05 августа 2010

Насколько я знаю, есть 2 уровня предупреждений памяти.applicationDidReceiveMemoryWarning не имеет уровня предупреждения.Есть ли способ получить эту информацию?

Ответы [ 2 ]

6 голосов
/ 06 августа 2010

Я добавляю это как отдельный ответ, чем мой другой, потому что это отдельный ответ.Ответ, который я дал ранее, является практическим, который вы ДОЛЖНЫ использовать.Он сводится к тому, чтобы «иметь дело с предупреждением об уровне памяти, о котором вы уведомлены, и не беспокоиться о деталях».

Если, однако, вы действительно действительно хотите узнать об этом больше, проверьтеиз этого недокументированного API: http://www.opensource.apple.com/source/Libc/Libc-594.1.4/include/libkern/OSMemoryNotification.h

Это заголовок кода ядра, который генерирует предупреждения памяти, и он объявляет следующий typedef:

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

У нас, очевидно, нет реализацииключевой метод (OSMemoryNotificationCurrentLevel()), который выполняет математику, чтобы сказать, какое предупреждение вернуть, но это список возможных возвращаемых значений.

Вы можете использовать библиотеку Mach.h, чтобы проверить фактические уровни памяти наустройство (дайте мне знать, если вам нужен какой-то код, который это делает), а затем используйте OSMemoryNotificationCurrentLevel(), чтобы получить текущий уровень предупреждения о памяти и действительно отобразить уровень уведомлений в физическое состояние машины.Такое приложение будет совершенно нежелательным в магазине приложений, и оно не поможет вам в реальной разработке, где ваша задача - реагировать на один уровень предупреждения о нехватке памяти, который вы получаете.

4 голосов
/ 05 августа 2010

Дело не в том, что есть два уровня предупреждения - не в смысле, например, «у вас осталось немного памяти» и затем «у вас осталось меньше памяти». Дело в том, что одно и то же предупреждение о нехватке памяти срабатывает в двух местах. Однажды в подклассе UIViewController, который в данный момент находится в поле зрения (и, если этот UIVC не реализует didReceiveMemoryWarning, он будет пузыриться до вершины стека контроллера представления), и снова в Application Delegate в applicationDidReceiveMemoryWarning. Одно не является «худшим» предупреждением, чем другое, это всего лишь два разных хука для реализации ответа на одно и то же предупреждение от ОС.

Это одна из странностей платформы, которую вы не можете точно знать, сколько памяти у вас будет доступно в любое время. Фоновые приложения (почта, телефон и т. Д.) Отнимают столько оперативной памяти, сколько им нужно, и вы остаетесь, чтобы получить остальное, и единственный способ узнать, что вы стали слишком большими, - это когда ОС говорит об этом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...