Con respecto al arte negro de administrar la memoria en los dispositivos con sistema operativo de iPhone: ¿qué significan los diferentes niveles de advertencia de memoria? ¿Nivel 1? ¿Nivel 2? ¿El dial va a 11?
Contexto: después de un extenso período de prueba de estrés de memoria, que incluye la ejecución de mi aplicación para iPad con la aplicación de reproducción de música iPod, me inclino a ignorar las advertencias de memoria aleatorias pero infrecuentes que estoy recibiendo. Mi aplicación nunca se cuelga. Nunca. Mi aplicación no tiene fugas. Y, bueno, las advertencias de mems simplemente no parecen importar.
Gracias,
Doug
Básicamente, las advertencias significan que el dispositivo se está quedando sin memoria, y que, “¡Si pudieras por favor liberar algo de memoria que no estás usando activamente, eso sería genial! “. Si su gestión de memoria es estrecha y no tiene objetos que prácticamente podrían descartarse, simplemente pase el mensaje e ignórelo.
MemoryBoard registra las advertencias de nivel de memoria. Como desarrollador de aplicaciones, no es necesario que te importe. Solo respondiendo a -{application}didReceiveMemoryWarning
es suficiente.
Hay 4 niveles de advertencias (0 a 3). Estos se configuran desde el observador de la memoria del kernel, y se pueden obtener mediante la función no tan pública OSMemoryNotificationCurrentLevel()
.
typedef enum { OSMemoryNotificationLevelAny = -1, OSMemoryNotificationLevelNormal = 0, OSMemoryNotificationLevelWarning = 1, OSMemoryNotificationLevelUrgent = 2, OSMemoryNotificationLevelCritical = 3 } OSMemoryNotificationLevel;
Cómo se desencadenan los niveles no está documentado. SpringBoard está configurado para hacer lo siguiente en cada nivel de memoria:
Matar a la aplicación activa (jetsam) no es manejado por SpringBoard, sino launchd
.
De OSMemoryNotification.h ,
/* ** Threshold values for notifications */ typedef enum { OSMemoryNotificationLevelAny = -1, OSMemoryNotificationLevelNormal = 0, OSMemoryNotificationLevelWarning = 1, OSMemoryNotificationLevelUrgent = 2, OSMemoryNotificationLevelCritical = 3 } OSMemoryNotificationLevel;
totoal 5 niveles de advertencia de memoria (-1,3).
Con respecto a la descripción de advertencia de nivel de memoria, la respuesta de @KennyTM es excelente.
Quiero agregar varios puntos relacionados que pueden ayudar a PM y a otros.
¿Qué debe hacer al tener una advertencia de nivel de memoria?
Al recibir cualquiera de estas advertencias, su método de manejo debe responder liberando inmediatamente cualquier memoria innecesaria. Por ejemplo, el comportamiento predeterminado de la clase UIViewController es purgar su vista si esa vista no está actualmente visible; las subclases pueden complementar el comportamiento predeterminado purgando estructuras de datos adicionales. Una aplicación que mantiene un caché de imágenes puede responder liberando cualquier imagen que no esté actualmente en pantalla.
¿Cómo observar la advertencia de nivel de memoria?
Cuando el sistema envíe una advertencia de poca memoria a su aplicación, responda de inmediato. iOS notifica todas las aplicaciones en ejecución cada vez que la cantidad de memoria libre cae por debajo de un umbral seguro. (No notifica las aplicaciones suspendidas). Si su aplicación recibe esta advertencia, debe liberar la mayor cantidad de memoria posible. La mejor manera de hacerlo es eliminar referencias fuertes a cachés, objetos de imagen y otros objetos de datos que puedan volver a crearse más adelante.
UIKit proporciona varias formas de recibir advertencias de memoria baja, incluidas las siguientes:
¿Cómo reducir el espacio de memoria de tu aplicación?
¿Cómo asignar memoria sabiamente?