83 votos

el iPhone OS de Memoria Advertencias. ¿Qué Significan Los Diferentes Niveles De Decir?

Sobre el arte negro de la gestión de la memoria en el iPhone OS dispositivos: ¿qué significan los diferentes niveles de la memoria de advertencia significa. De nivel 1? Nivel 2? ¿La esfera ir a la 11?

Contexto: Después de una extensa memoria de estrés período de prueba, incluida la ejecución de mi aplicación para iPad con la aplicación reproductor de música iPod jugar, me inclino a ignorar el azar todavía poco frecuentes memoria advertencias estoy recibiendo. Mi aplicación nunca se bloquea. Jamás. Mi aplicación es libre de pérdidas. Y, además, los mems advertencias simplemente parece que no importa.

Gracias,
Doug

189voto

KennyTM Puntos 232647

Nivel de memoria advertencias se registran por el Trampolín. Como un desarrollador de la aplicación que usted no necesita preocuparse por ella. Contestando -{application}didReceiveMemoryWarning es suficiente.


Existen 4 niveles de advertencias (de 0 a 3). Estos se establecen a partir de la memoria del núcleo observador, y puede ser obtenida por el no-tan-de la función pública OSMemoryNotificationCurrentLevel().

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

Cómo los niveles se activan no está documentado. Trampolín está configurado para hacer la siguiente en cada nivel de memoria:

  1. Advertencia (no normal) - Relanzamiento, o retraso auto relanzamiento de los antecedentes apps por correspondencia.
  2. Urgente - Salga de todas las aplicaciones de fondo, por ejemplo, Safari y iPod.
  3. Críticas y más allá - El kernel va a tomar más, probablemente matando Trampolín o incluso reiniciar.

Matar a la aplicación activa (desechos) no es manejado por el " SpringBoard", pero launchd.

93voto

Williham Totland Puntos 15798

Básicamente las advertencias significa que el dispositivo tiene poca memoria, y que, "Si pudiera liberar algo de memoria que usted no está utilizando activamente que sería hinchan!". Si su gestión de la memoria es apretado, y usted no tiene objetos que pudieran estar prácticamente descartado, acaba de pasar el mensaje a lo largo y lo ignoran.

10voto

De OSMemoryNotification.h,

/*
** Threshold values for notifications
*/

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

totoal de 5 niveles de la memoria de advertencia (-1,3).

Respecto a la Memoria de advertencia del Nivel de la descripción, @KennyTM la respuesta es excelente.

Quiero añadir varios relacionados con los puntos que pueden ayudar a PM y otros.


¿Qué debe hacer cuando se tiene Memoria de Advertencia de Nivel?

Tras la recepción de cualquiera de estas advertencias, su método de control debe responder de manera inmediata a la liberación de cualquier innecesarios de la memoria. Por ejemplo, el comportamiento predeterminado de la UIViewController clase es para purgar su opinión, si esa visión no es actualmente visible; las subclases pueden complementar el comportamiento predeterminado por la depuración adicional de las estructuras de datos. Una aplicación que mantiene una caché de imágenes puede responder por la liberación de alguna de las imágenes que no están actualmente en la pantalla.


Cómo observar el Nivel de Memoria advertencia?

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

Cuando el sistema se distribuye bajo advertencia memoria para su aplicación, responde de inmediato. iOS notifica a todas las aplicaciones en ejecución cuando la cantidad de memoria libre cae por debajo de un umbral de seguridad. (No notificar aplicaciones suspendidas.) Si la aplicación recibe esta advertencia, se debe liberar la memoria tanto como sea posible. La mejor manera de hacer esto es para quitar referencias fuertes a la memoria caché, de los objetos de la imagen, y otros objetos de datos que se pueden crear de nuevo más tarde.

UIKit proporciona varias maneras de recibir poca memoria advertencias, incluyendo los siguientes:

  • Implementar el applicationDidReceiveMemoryWarning: método de tu aplicación delegado.
  • Reemplazar el didReceiveMemoryWarning método personalizado UIViewController subclase.
  • Regístrese para recibir UIApplicationDidReceiveMemoryWarningnotificationnotification.

Cómo Reducir Su Aplicación Huella en la Memoria?

  • Eliminar las fugas de memoria.
  • Hacer que los archivos de recursos tan pequeño como sea posible.
  • Uso de Datos Básicos o SQLite para grandes conjuntos de datos.
  • Carga de recursos perezosamente.
  • Construir su programa utilizando el Pulgar opción.

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


Cómo asignar memoria sabiamente?

  • Reducir el uso de autoreleased objetos : Con cambio automático de referencia contando (ARC), es mejor alloc/init objetos y dejar que el versión de compilador para usted en el momento adecuado. Esto es cierto incluso para los objetos temporales que en el pasado, usted podría tener autoreleased que les impide vivir más allá de los límites de la método actual.
  • Imponer límites de tamaño en los recursos : Evitar la carga de un gran archivo de recursos cuando un menor que uno va a hacer. En lugar de utilizar una imagen de alta resolución, use uno que es de tamaño apropiado para iOS basado en dispositivos. Si debe utilizar grandes archivos de recursos, encontrar formas para cargar solo la parte de el archivo que usted necesita en cualquier momento dado. Por ejemplo, en lugar de cargar el archivo completo en la memoria, el uso de las mmap y munmap funciones para asignar partes del archivo en y fuera de la memoria. Para obtener más información acerca de la asignación de los archivos en la memoria.
  • Evitar unbounded conjuntos de problemas : Unbounded conjuntos de problemas puede requerir una cantidad arbitrariamente grande de datos para calcular. Si el conjunto requiere más memoria de la disponible, su aplicación puede ser incapaz de completar el cálculos. Sus aplicaciones deben evitar este tipo de series siempre que sea posible y el trabajo sobre problemas conocidos con los límites de la memoria.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: