Pregunta

Para citar del documento CGLayer:

  

Quartz almacena en caché todos los objetos que se reutilizan, incluidos los objetos CGLayer.

Estoy teniendo problemas con la memoria en páginas grandes y estoy tratando de implementar un mecanismo simple donde las vistas se liberan y se recrean en función de si están activadas o no en la pantalla.

Por simplicidad, tengo un montón de UIImages, creados como resultado de una solicitud de red, guardados en una matriz en algún lugar. Creo un UIImageView así:

anImage = [anArray objectAtIndex:0];
UIImageView* imgView = [[UIImageView alloc] initWithImage:anImage];
[mainView addSubview:imgView]; // Quartz eats memory for view after first draw
[imgView release];             // owned by mainView now
[...]                          // wait a bit for draw cycle
[imgView removeFromSuperview]; // memory doesn't go down

Cuando el imgView se sale de la pantalla, es removedFromSuperview y se libera. Bien cierto No, el CGLayer que existe en Quartz no se elimina, porque anImage todavía existe.

¿Cómo puedo solucionar esto? La única forma en este escenario es crear una imagen exactamente igual detrás de la parte posterior de Quartz con una dirección de puntero diferente y eliminar la imagen antigua. Y la única forma de hacer esto es "copiar en profundidad" la imagen (UIImage no implementa NSCoding) o solicitarla nuevamente a través de la red (lenta).

Lo que estoy pensando es que necesito combinar mis imágenes en una base de datos y recuperarlas cada vez que aparece una vista en la pantalla, pero me encantaría escuchar los pensamientos de la gente sobre esto.

¿Fue útil?

Solución

Aquí incrementas imgView de 0 a 1.

UIImageView* imgView = [[UIImageView alloc] initWithImage:anImage];

En la siguiente línea, mainView incrementa el recuento de referencia. (ahora es 2)

[mainView addSubview:imgView]; // Quartz eats memory for view after first draw

Aquí, liberas imgView y el recuento de referencia se reduce a uno.

[imgView release]; // owned by mainView now

No creo que tus problemas de memoria tengan nada que ver con una imagen. Mientras imgView sea una subvista, no liberará ese objeto, ya que necesita ese objeto para dibujar en la pantalla.

Lo que significa la siguiente línea, es que si dibujas programáticamente en tu CGLayer, Cuarzo con caché lo que has dibujado, de modo que no estés redibujando constantemente lo mismo. No está realmente relacionado con la adición de subvistas.

  

Quartz almacena en caché todos los objetos que se reutilizan, incluidos los objetos CGLayer.

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