veo tienen tiene porque poca memoria los donde 1gb ios memory-management uiimageview uiimage addsubview

tienen - Pobre rendimiento de gestión de memoria para imágenes en dispositivos ios



porque iphone tiene 1gb de ram (1)

Cuando utiliza una imagen de 500x500 en un UIImageView más UIImageView , todavía está cargando la imagen más grande en la memoria. Puedes resolver esto cambiando el tamaño del UIImage , en sí mismo (no solo ajustando el frame del UIImageView ), creando una imagen de 160x160 y usando esa imagen en tu vista. Consulte esta respuesta para ver si hay algún código para cambiar el tamaño de la imagen, que luego se puede invocar de la siguiente manera:

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

Puede que quiera guardar la imagen redimensionada, para que no se estorbe constantemente con la carga computacional de crear las 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 archivo PNG correspondiente a su imagen pequeña en futuras invocaciones de la vista.

En respuesta a su pregunta, ¿por qué ocupa tanta memoria? Se debe a que, aunque la imagen probablemente se almacena como un JPG comprimido o PNG en almacenamiento persistente, sospecho que en la memoria se mantiene como un mapa de bits sin comprimir. Hay muchos formatos internos, pero uno común es un formato 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 memoria. Pero una imagen de 160 x 160 debe ser aproximadamente una décima parte del tamaño.

Tengo el siguiente problema:

Tengo un objeto de vista principal (que hereda de UIView) que muestra una cuadrícula de 16 cuadrados (cada uno es una clase que he creado que hereda de UIImageView), en un diseño de 4x4.

Cada uno de estos 16 cuadrados es 160x160, y contiene una imagen (una imagen diferente para cada cuadrado) que no es más grande que 30kb. La imagen, sin embargo, es de 500x500 (porque se usa en otro lugar del programa, en su tamaño completo), por lo que se redimensiona en la clase "cuadrada" a 160x160, mediante el método setFrame.

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

  1. cada uno de estos cuadrados, cuando se agrega al objeto de vista principal, aumenta el uso de memoria de la aplicación en 1 MB. Esto no ocurre en la creación de instancias, sino solo cuando son agregados por [self addSubview: square] en el objeto de vista primario.
  2. si utilizo la misma imagen para todos los cuadrados, el aumento de la memoria es mínimo. Si inicializo los objetos cuadrados sin ninguna imagen, entonces el aumento es básicamente cero.
  3. la misma aplicación, cuando se ejecuta en el simulador, usa 1/6 de la memoria que tiene en un dispositivo real.

El punto aquí es: ¿por qué cada uno de los cuadrados consume hasta 1 MB de memoria al cargar una imagen de 30 kb? ¿Hay alguna manera de reducir esto? He intentado crear las imágenes de varias maneras diferentes: [UIImage imageNamed:img] , [UIImage imageWithContentsFromFile:path] , [UIImage imageWithData:imgData scale:scale] , además de no redimensionar el fotograma.