Pregunta

Mi aplicación, que usa ARC, hace lo siguiente:

  1. Sube una foto tomada por la cámara.
  2. Comprime la imagen para usarla como miniatura.
  3. Hago esto usando [UIImage imageWithData:UIImageJPEGRepresentation( original, 0.1f )]
  4. Configuré la referencia de la imagen sin comprimir en cero para que ARC libere la memoria

Repetir esta secuencia significará que habrá varias miniaturas comprimidas en la pantalla.Después de aproximadamente 7 u 8 imágenes, la aplicación fallará debido a la poca memoria.

En Instrumentos, estoy intentando utilizar Asignaciones junto con Memory Monitor para encontrar el origen de mi problema.

Algunas estadísticas de instrumentos:

Asignación - Live Bytes aumenta aproximadamente 2 MB después de tomar una fotografía, pero luego baja 1,5 MB después de que la referencia de la imagen original se establece en cero.Eso parece algo bueno, pero...

Aquí hay un estado final de la aplicación.#Living parece ser muy alto en relación con los Live Bytes, ¿verdad?

  Live Bytes  #Living   #Transitory  Overall   #Overall Bytes    
   3.72 MB    24538     80679        90.1 MB   105301

Monitor de memoria (cabezal de inspección de seguimiento) - Mi aplicación se inicia con 7,5 MB y al tomar una fotografía, la cantidad aumenta ~13 MB.Para el estado que enumeré anteriormente, Memory Monitor dice que la aplicación está ocupando 72,67 MB de "Memoria real" y 123,79 MB de memoria virtual.

Dado que los Live Bytes son muy pequeños, sé que estoy haciendo algo correcto.Sin embargo, dado que la huella de memoria en otros lugares es grande, también estoy seguro de que estoy haciendo algo muy mal.¿Alguna idea de qué podría ser eso o cómo localizarlo?

¿Fue útil?

Solución

Eitan27,

Este no es un problema de ARC.Se trata de cómo administrar varios elementos grandes en la memoria.iOS tiene varios mecanismos para ayudarte aquí.Si escribe la imagen en flash y luego la vuelve a abrir como datos mapeados en memoria, la mayoría de las veces resolverá su problema.¿Cómo?El sistema operativo administra el mapeo en su huella de memoria residente con datos inmutables.Debido a que estos elementos son inmutables y, por lo tanto, nunca se ensucian, puede eliminar las páginas asignadas cuando sea necesario.La desventaja de este mecanismo es la cantidad limitada de descriptores de archivos disponibles para cada aplicación.

Andrew

Otros consejos

Utilice un @autoreleasepool bloquear:

@autoreleasepool {
    //code that inits the UIImage and sets it to nil
}

Ver ARC proporciona una nueva declaración para gestionar grupos de liberación automática Sección de Transición a las notas de la versión ARC

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top