Rendimiento de administración de memory deficiente para imágenes en dispositivos ios

Tengo el siguiente problema:

Tengo un object de vista principal (que henetworkinga de UIView) que muestra una cuadrícula de 16 cuadrados (cada uno es una class que he henetworkingado de UIImageView), en un layout de 4×4.

Cada uno de estos 16 cuadrados es 160×160, y contiene una image (una image diferente para cada cuadrado) que no es mayor que 30kb. Sin embargo, la image es 500×500 (porque se usa en cualquier otro lugar del progtwig, en su tamaño completo), por lo que cambia el tamaño de la class "cuadrada" a 160×160, mediante el método setFrame.

Al observar la function de administración de memory de Xcode cuando la aplicación se está ejecutando, he notado algunas cosas:

  1. cada uno de estos cuadrados, cuando se agrega al object de vista principal, aumenta el uso de memory de la aplicación en 1 MB. Esto no ocurre en la instanciación, pero solo cuando se agregan [self addSubview: square] en el object de vista principal.
  2. si uso la misma image para todos los cuadrados, el aumento de la memory es mínimo. Si inicializo los objects cuadrados sin imágenes, el aumento es básicamente cero.
  3. la misma aplicación, cuando se ejecuta en el simulador, usa 1/6 de la memory que tiene en un dispositivo real.

El punto completo aquí es: ¿por qué cada uno de los cuadrados usa hasta 1 MB de memory al cargar una image de 30 kb? ¿Hay alguna manera de networkingucir esto? He intentado crear las imágenes de diferentes forms: [UIImage imageNamed:img] , [UIImage imageWithContentsFromFile:path] , [UIImage imageWithData:imgData scale:scale] , así como también no cambiar el tamaño del marco.

Cuando usa una image de 500×500 en un UIImageView más UIImageView , todavía está cargando la image más grande en la memory. Puede resolver esto cambiando el tamaño del UIImage , en sí mismo (no solo ajustando el frame del UIImageView ), haciendo una image de 160×160, y usar esa image en su vista. Consulte esta respuesta para get un código para cambiar el tamaño de la image, que luego puede invocarse de la siguiente manera:

 UIImage *smallImage = [image scaleImageToSizeAspectFill:CGSizeMake(160, 160)]; 

Es posible que desee save la image networkingimensionada, por lo que no se está sobrecargando constantemente con la sobrecarga computacional de crear imágenes más pequeñas cada vez, por ejemplo:

 NSData *data = UIImagePNGRepresentation(smallImage); [data writeToFile:path atomically:YES]; 

A continuación, puede cargar ese file PNG correspondiente a su image pequeña en futuras invocaciones de la vista.


En respuesta a su pregunta de por qué ocupa tanta memory, es porque mientras que la image probablemente se almacene como JPG o PNG comprimido en almacenamiento persistente, sospecho que en la memory se mantiene como un bitmap sin comprimir. Hay muchos formattings internos, pero uno común es un formatting de 32 bits con 8 bits cada uno para rojo, verde, azul y alfa. Independientemente de los detalles, puede ver rápidamente cómo una representación de 500 x 500 píxeles, con 4 bytes por píxel, podría traducirse en 1 mb de memory. Pero una image de 160 x 160 debería ser aproximadamente una décima del tamaño.