¿Ves este fragmento de 32 MB de VM_ALLOCATE cuando corriendo en el dispositivo o en el simulador?
Pregunto porque cuando jugué con el instrumento de asignaciones en la aplicación OS X en la que estoy trabajando, también noté un fragmento de 32 MB de VM_ALLOCATE y me pregunto si esto es un subproducto de la ejecución en el entorno OS X Ejecutar en el dispositivo puede darle un conjunto de datos diferente.
En general, sin embargo, la memoria residente es la memoria que utiliza su aplicación que no se intercambia en el disco. En iOS, no hay intercambio, por lo que la memoria residente debe ser igual a la huella de memoria virtual.
La memoria sucia es la memoria que ha asignado y utilizado. La memoria sucia debe ser menor que la memoria residente porque esta última incluye código (tuyo y marcos).
No estoy seguro exactamente de lo que está haciendo en su aplicación, pero supongo que ha cargado algunos activos grandes de su paquete y los mantiene cerca. No hagas esto, cuando sea posible.
También hay API que puede utilizar al cargar objetos NSData que utilizan una técnica de asignación de memoria en lugar de lectura de bytes de fuerza bruta. Esto puede ser mejor porque permite que el sistema operativo lea las páginas del disco de forma perezosa. Con NSData (dado que no es mutable), también podría ser lo suficientemente inteligente como para marcar las páginas como de solo lectura. Teóricamente, esta es una pista valiosa para el sistema operativo que puede purgar esas páginas cuando está bajo presión, ya que sabe que no puede cambiar. Lea los documentos para +[NSData dataWithContentsOfMappedFile:]
.
Para las imágenes, recuerdo haber leído algo que sugería evitar imageNamed:
a excepción de las imágenes que usabas regularmente a través de tu aplicación (es decir, elementos de la IU). Especialmente para imágenes grandes, pueden permanecer en un caché sobre el que no tienes control. (imageNamed:
tenía una fuga en el 2.x días, pero se corrigió en 3.x y es perfectamente seguro de usar hoy en día.) Use imageWithContentsOfFile:
para obtener imágenes más grandes e imágenes que no sean una parte recurrente de su UI.
Si carga imágenes de la red, guárdelas en el disco y libere los bytes sin procesar después de crear el UIImage
. Si las vistas de la imagen están descargadas debido a la presión de la memoria, no desea presionar la red para cargar los datos nuevamente, pero tampoco desea mantener dos copias (una NSData
y la UIImage
) cargadas.
¿Los datos provienen de ejecutar la aplicación en el simulador o en el dispositivo? –
Steve - He hecho ambas cosas, pero creo que los datos mostrados arriba son del Simulador. –