¿Hay alguna forma de borrar la caché utilizada por la clase UIImage?


Es bien sabido que UIImage almacena en caché sus datos de imagen cuando la imagen se carga utilizando el método imageNamed:.

De la documentación de apple: https://developer.apple.com/documentation/uikit/uiimage/1624146-imagenamed

Nombre de la imagen:

Discusión: Este método se ve en el cachés del sistema para un objeto de imagen con el nombre especificado y devuelve que objete si existe. Si una coincidencia objeto de imagen no está ya en el caché, este método carga la imagen datos del archivo especificado, cachés it , y luego devuelve el resultado objeto.

Debido a eso, después de cargar varias imágenes con imageNamed: noté un gran aumento del uso de memoria y también que la memoria se mantuvo en uso incluso después de que el controlador que cargó las imágenes fuera dealloc. (al menos no aumentó de nuevo cuando asigné el mismo controlador)

Eso me hizo preguntarme si hay alguna manera de limpiar la caché utilizada por UIImage programáticamente en cualquier momento del ciclo de vida de mi aplicación o incluso controlar algunos parámetros de caché (como la memoria máxima que puede utilizar, por ejemplo)

Sé que podría resolver fácilmente este problema usando initWithData, imageWithData, imageWithContentsOfFile o cualquier otro inicializador en lugar de imageNamed, pero este comportamiento de caché se desea cuando se utilizan varias imágenes, como dentro de un UITableView.

¿Algún pensamiento sobre cómo lograr eso?

EDITAR: Después de algunas respuestas solo quiero deje claro que hay una gran brecha entre la necesidad de hacer algo y tener la posibilidad de hacer algo. Como he señalado, sé que el sistema operativo se encarga de esa caché para mí, solo estoy tratando de ver las limitaciones que impone el SDK de iOS.

Author: Cœur, 2011-05-13

3 answers

No hay manera que yo sepa de borrar manualmente esta caché administrada de iOS. En general, esto es una pista falsa. Cuando el sistema operativo administra algo por usted, no necesita preocuparse por ello. Mientras esté liberando correctamente cualquier cosa que asigne / retenga y manejando las advertencias de memoria apropiadamente, estará haciendo su parte.

 7
Author: XJones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-13 02:52:55

Respuesta tomada de Kevin Low comentario


Si puedes usar api privadas (como en una aplicación solo AdHoc, por ejemplo) usa esto UIImage método para eliminar todas las imágenes de la caché

[UIImage _flushSharedImageCache];
 3
Author: Felipe Sabino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:07:14

La caché se vaciará cuando sea necesario, es decir, cuando la aplicación reciba una Advertencia de Baja Memoria. No hay razón para que lo haga usted mismo, y no hay API pública disponible.

 0
Author: Mike Weller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-13 11:20:46