2010-05-26 14 views
84

En cuanto al arte negro de administrar la memoria en dispositivos con sistema operativo iPhone: ¿qué significan los diferentes niveles de advertencia de memoria? ¿Nivel 1? ¿Nivel 2? ¿El dial va a 11?iPhone OS Advertencias de memoria. ¿Qué significan los diferentes niveles?

Contexto: Después de un extenso período de prueba de estrés de memoria, incluida 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 recibo. Mi aplicación nunca cuelga. Nunca. Mi aplicación no tiene fugas. Y, bueno, las advertencias de mems simplemente no parecen importar.

Gracias,
Doug

Respuesta

95

Básicamente las advertencias indican que el dispositivoestá quedando sin memoria, y que, "Si pudiera complacer a liberar algo de memoria no está usando activamente Eso sería swell! ". 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.

+25

LOL "¡Si pudieras por favor liberar algo de memoria que no estás usando activamente, eso sería genial!" Priceless ;-) Cheers – dugla

+15

Pareces un veterano veterano de la danza de memoria de iPhone OS Wack-a-mole. – dugla

+1

Tomado de _El guardián en el Rye_? 'código genial;)' – wagashi

192

Las advertencias de nivel de memoria se registran en SpringBoard. Como desarrollador de aplicaciones, no es necesario que te importe. Solo responder a -{application}didReceiveMemoryWarning es suficiente.


Hay 4 niveles de advertencias (0 a 3). Estos se establecen desde el vigilante de la memoria del kernel, y se pueden obtener por el not-so-public function OSMemoryNotificationCurrentLevel().

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

Cómo se documentan 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 relanzamiento automático de aplicaciones secundarias no esenciales, p. Correo.
  2. Urgente: salga de todas las aplicaciones en segundo plano, p. Safari y iPod
  3. Crítica y más: el kernel tomará el control, probablemente matando a SpringBoard o incluso reiniciando.

Killing the active app (jetsam) no es manejado por SpringBoard, pero launchd.

+0

Gracias por esto. Fue una sacudida entre usted y Williham el comediante sobre esta cuestión. El humor gana. Aclamaciones. – dugla

+0

Hola, Tengo el mismo problema. Después de ejecutar la aplicación continuamente por más de 5 veces, recibo una advertencia de memoria Recibida. Nivel = 1 por 20 veces, pero la aplicación no falla. Pero cuando recibo este mensaje, recibo una advertencia de memoria. Nivel = 2 mi aplicación está fallando. El nivel 2 aparece después de que aparece Level1 casi 20 veces. ¿Cómo puedo hacer que mi aplicación no se cuelgue? Gracias –

+3

@srik: utilice menos memoria. – kennytm

12

De OSMemoryNotification.h,

/* 
** Threshold values for notifications 
*/ 

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

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

En cuanto a la descripción de la advertencia de Nivel de memoria, la respuesta de @KennyTM es excelente.

Quiero agregar varios puntos relacionados que pueden ayudar a PM y otros.


¿Qué debe hacer cuando se tiene memoria Nivel de advertencia?

Al recibir cualquiera de estas advertencias, el método de su controlador 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 le envía una advertencia de poca memoria para su aplicación, responder de forma inmediata. 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 ofrece varias maneras de recibir advertencias de poca memoria, incluyendo las siguientes:

  • poner en práctica el método de applicationDidReceiveMemoryWarning: delegado de la aplicación .
  • Reemplace el método didReceiveMemoryWarning en su subclase personalizada UIViewController.
  • Regístrese para recibir la UIApplicationDidReceiveMemoryWarningNotificationnotification.

Cómo reducir su consumo de memoria de la aplicación?

  • Elimina fugas de memoria.
  • 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 de forma perezosa.
  • Crea tu programa 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?

  • reducir su uso de objetos autoreleased: Con referencia automática conteo (ARC), es mejor a los objetos init alloc/y dejar que el compilador los pongan en libertad para que en el momento apropiado. Esto es cierto incluso para objetos temporales que en el pasado podría tener liberados automáticamente para evitar que sobrepasen el alcance del método actual .
  • Imponer límites de tamaño a los recursos: Evite cargar un archivo de recursos de gran tamaño 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, busque maneras de cargar solo la parte de el archivo que necesita en un momento dado.Por ejemplo, en lugar de , cargue 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 acerca de mapeo de archivos en la memoria.
  • Evite conjuntos de problemas sin límites: los conjuntos de problemas sin límites 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 trabajan en problemas con límites de memoria conocidos.
+1

Me gusta el último punto: "Haz un programa diferente". – Brent

Cuestiones relacionadas