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. Nivel 1? Nivel 2? ¿La esfera vaya 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 siento inclinado a ignorar el azar pero poco frecuentes memoria advertencias estoy recibiendo. Mi app nunca se bloquea. Nunca. Mi aplicación es libre de pérdidas. Y, además, los mems advertencias simplemente parece que no importa.

Gracias,

Doug

InformationsquelleAutor dugla | 2010-05-26

3 Comentarios

  1. 96

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

    • LOL «Si pudiera liberar algo de memoria usted no está utilizando activamente que sería hinchan!» De Valor Incalculable 😉 Saludos
    • Suena como una grissled veterano del iPhone OS wack-a-mole de la memoria de la danza.
    • Tomado de El Catcher in the Rye? great code ;)
  2. 193

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


    Hay 4 niveles de advertencias (0 a 3). Estos se establecen a partir de la memoria del kernel observador, y puede ser obtenida por el no tan público de la función 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 lo siguiente en cada nivel de memoria:

    1. De advertencia (no normal) — Relanzamiento, o el retraso de auto relanzamiento de los antecedentes apps por correspondencia.
    2. Urgente — Salga de todas las aplicaciones de fondo, por ejemplo, Safari y iPod.
    3. Crítica y más allá — El núcleo tomará más, probablemente matando Trampolín o incluso reiniciar.

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

    • Gracias por este. Fue un lanzamiento entre usted y Williham el comediante en esta pregunta. El Humor de la gana. Saludos.
    • Hola, tengo el mismo problema. Después de ejecutar la aplicación de forma continua por más de 5 veces, me estoy haciendo Recibido la memoria de advertencia. Nivel=1 de 20 veces, pero la aplicación es de no chocar. Pero cuando llego a este mensaje, Recibido de la memoria de advertencia. Nivel=2 mi aplicación se bloquea. Nivel2 es que aparecen después de Nivel1 que aparecen durante casi 20 veces. ¿Cómo puedo hacer que mi aplicación y no te choques. Gracias
    • El uso de menos memoria.
    • Menos memoria significa , ¿cuánto podemos usar al máximo. Cuánto podemos vivir bytes. En mi registro de bloqueo tengo este. Libre páginas: 371 Cable páginas: 12192 Purgeable páginas: 0 más Grande de proceso: DTMobileIS ¿Qué quiere decir esto ? Dónde debo tener cuidado ? Gracias.
    • Es mejor hacer una nueva pregunta.
    • Gracias por responder a la OP. Muy informativo.
    • Muy informativo.
    • es esto posible con ios8? He visto que la función está definida en libsystem_c.dylib. Sería genial si pudiera ir adelante y utilizarlo. Gracias

  3. 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 advertencia memoria (-1,3).

    Con respecto a la Memoria la 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?

    Al recibir alguna de estas advertencias, su método de control debe responder de inmediato la liberación de cualquier innecesarios de la memoria. Por ejemplo, el comportamiento predeterminado de la UIViewController clase es para purgar su punto de vista si este punto de vista no está visible; las subclases pueden complementar el comportamiento predeterminado por la depuración adicional 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 de advertencia?

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

    Cuando el sistema envía una baja en la memoria de la advertencia de su aplicación, responde de inmediato. iOS notifica a todas las aplicaciones en funcionamiento cuando la cantidad de memoria libre cae por debajo de un umbral de seguridad. (No notificar suspendidos aplicaciones). Si tu aplicación recibe este aviso, debe liberar la memoria tanto como sea posible. La mejor manera de hacer esto es para quitar referencias fuertes a cachés, 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 las siguientes:

    • Implementar el applicationDidReceiveMemoryWarning: método de su aplicación
      delegado.
    • Reemplazar el didReceiveMemoryWarning método personalizado
      UIViewController subclase.
    • Registrarse para recibir el
      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.
    • De carga de los 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?

    • A reducir el uso de autoreleased objetos : automático de referencia
      contando (ARC), es mejor asignación/init objetos y dejar que la
      versión de compilador de ellos para usted en el momento adecuado. Esto es cierto
      incluso para 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 de 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,
      uso uno que es del tamaño adecuado para iOS 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 porciones de los archivos dentro y fuera de la memoria. Para más
      información acerca de la asignación de archivos en la memoria.
    • Evitar ilimitado de conjuntos de problemas : Ilimitado de conjuntos de problemas puede requerir
      una cantidad arbitrariamente grande de datos para calcular. Si el conjunto requiere
      más memoria de la disponible, la aplicación puede no ser capaz de completar la
      los 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.
    • Me gusta la última viñeta, «Hacer un programa diferente.»

Dejar respuesta

Please enter your comment!
Please enter your name here