Advertencias de memoria de iPhone OS. ¿Qué significan los diferentes niveles?

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:

  1. Advertencia (no normal): relanzar o retrasar el reinicio automático de aplicaciones secundarias no esenciales, por ejemplo, correo.
  2. Urgente: salga de todas las aplicaciones en segundo plano, p. Ej., Safari e iPod.
  3. Crítica y más: el kernel tomará el control, probablemente matando SpringBoard o incluso reiniciando.

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?

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

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:

  • Implemente el método applicationDidReceiveMemoryWarning: de su delegado de aplicaciones.
  • Reemplace el método didReceiveMemoryWarning en su subclase UIViewController personalizada.
  • Regístrese para recibir la UIApplicationDidReceiveMemoryWarningNotificationnotification.

¿Cómo reducir el espacio de memoria de tu aplicación?

  • Elimina memory leaks.
  • Haga que los archivos de recursos sean lo más pequeños posible.
  • Utilice Core Data o SQLite para grandes conjuntos de datos.
  • Cargue los recursos perezosamente.
  • Crea tu progtwig usando la opción Thumb.

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


¿Cómo asignar memoria sabiamente?

  • Reduzca el uso de objetos liberados automáticamente: con el recuento automático de referencias (ARC), es mejor asignar / iniciar objetos y dejar que el comstackdor los libere por usted en el momento apropiado. Esto es cierto incluso para objetos temporales que en el pasado podrían haberse liberado automáticamente para evitar que sobrepasen el scope del método actual.
  • Imponer límites de tamaño a los recursos : evite cargar un archivo de recursos grande cuando lo haga uno más pequeño. En lugar de usar una imagen de alta resolución, use una que tenga el tamaño adecuado para los dispositivos basados ​​en iOS. Si debe usar archivos de recursos grandes, encuentre maneras de cargar solo la parte del archivo que necesita en un momento dado. Por ejemplo, en lugar de cargar todo el archivo en la memoria, utilice las funciones mmap y munmap para asignar porciones de archivo dentro y fuera de la memoria. Para obtener más información sobre mapeo de archivos en la memoria.
  • Evite conjuntos de problemas ilimitados : los conjuntos de problemas ilimitados pueden requerir una cantidad arbitrariamente grande de datos para computar. Si el conjunto requiere más memoria que la disponible, es posible que su aplicación no pueda completar los cálculos. Sus aplicaciones deben evitar tales conjuntos siempre que sea posible y trabajar en problemas con límites de memoria conocidos.