NSCache, ¿removeAllObjects libera el uso de la memoria? estoy usando ARC

Estoy usando ARC y NSCache que se crean y almacenan en el delegado de mi aplicación. Luego lo llamo desde los controladores a través del delegado de la aplicación. El NSCache almacena imágenes a medida que se cargan desde una URL y el uso de la memoria aumenta muy rápido. Cuando reviso el generador de perfiles para el uso de memoria real, mi aplicación alcanza incluso 320 MB de uso de memoria, pero en las asignaciones dice que acaba de asignar 20-30 MB.

En el delegado de mi aplicación configuré el caché de la siguiente manera (es un ivar):

cache = [[NSCache alloc] init];
[cache setCountLimit:100];
[cache setTotalCostLimit:1500000];
[cache setEvictsObjectsWithDiscardedContent:YES];

Implementé un botón para experimentar con NSCache y cuando hago clic en él llama:

- (IBAction)eraseCache:(id)sender {
    [[appDelegate cache] removeAllObjects];
}

En el generador de perfiles, la memoria utilizada no disminuye, pero en realidad comienza a obtener las imágenes nuevamente, por lo que sé los objetos que se eliminaron. ¿Cómo puedo liberar este uso de memoria a voluntad usando ARC? ¿Cómo puedo obtener el tamaño de mi caché para saber cuándo liberarlo?

preguntado el 27 de julio de 12 a las 17:07

1 Respuestas

En ARC, una vez que no hay punteros a un objeto, se libera automáticamente. Si los únicos punteros que tenía al objeto estaban en el caché, entonces se han liberado.

Tenga en cuenta que en realidad no tiene que eliminar los objetos; si asigna el puntero a un objeto nuevo (con el resultado de que ya no apunta al objeto anterior), el objeto anterior se desasigna.

Ex:
NSArray *array = [NSArray new];
array = [NSArray new]; //the original array gets deallocated because nothing points to it.

De la referencia de clase NSCache:

La clase NSCache incorpora varias políticas de eliminación automática, que aseguran que no utilice demasiada memoria del sistema. El sistema lleva a cabo automáticamente estas políticas si otras aplicaciones necesitan memoria. Cuando se invocan, estas políticas eliminan algunos elementos de la memoria caché, lo que minimiza su consumo de memoria.

Respondido 27 Jul 12, 17:07

Entonces, ¿por qué el uso de la memoria no disminuye cuando presiono el botón "removeAllObjects"? ¿Qué podría estar pasando? - clopez

Podría permanecer en la memoria hasta que el sistema operativo decida que quiere esa memoria nuevamente. ¿Se bloqueó tu aplicación? - Dustin

¿Tienes alguna otra referencia a las imágenes? Tenga en cuenta que si se muestran en una vista, esto cuenta como una referencia sólida. También asegúrese de que su contenido esté configurado como descartable. - Dustin

Sí, están en UIImageView y se muestran en ViewController. ¿Qué recomiendas hacer? Por cierto, ¿qué quieres decir con "establecer como descartable"? - clopez

Lea la referencia de la clase NSCache, puede decirle si descartar una imagen. Si está mostrando muchas imágenes, elimine la vista de imagen del controlador de vista cuando necesite liberar memoria. - Dustin

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.