objective c - pasa - ¿Hay alguna manera de borrar el caché utilizado por la clase UIImage?
que pasa si borro los datos de cache (3)
Es bien sabido que UIImage guarda 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
imageNamed:
Discusión : este método busca en el caché del sistema un objeto de imagen con el nombre especificado y lo devuelve si existe. Si un objeto de imagen coincidente no está ya en la memoria caché, este método carga los datos de imagen del archivo especificado, lo almacena en la memoria caché y luego devuelve el objeto resultante.
Debido a eso, después de cargar varias imágenes con imageNamed:
noté un gran aumento en el uso de la memoria y también que la memoria se mantuvo en uso incluso después de que el controlador que cargó las imágenes fue dealloc. (al menos no aumentó de nuevo cuando asigné el mismo controlador)
Eso me hizo preguntarme si hay alguna manera de borrar el caché utilizado por UIImage programáticamente en cualquier momento dado del ciclo de vida de mi aplicación o incluso controlar algunos parámetros de caché (como la memoria máxima que puede usar, por ejemplo)
Sé que podría resolver fácilmente este problema utilizando initWithData
, imageWithData
, imageWithContentsOfFile
o cualquier otro inicializador en lugar de imageNamed
, pero este comportamiento de caché es deseable cuando se usan varias imágenes, como dentro de una UITableView
.
¿Alguna idea sobre cómo lograr eso?
EDITAR: Después de algunas respuestas solo quiero dejar en claro que hay una gran brecha entre tener que hacer algo y tener la posibilidad de hacer algo. Como señalé, sé que el sistema operativo se encarga de ese caché para mí, solo estoy tratando de ver las limitaciones que impone el iOS SDK.
La caché se vaciará cuando sea necesario, es decir, cuando la aplicación reciba una advertencia de memoria baja. No hay ninguna razón para que lo hagas tú mismo, y no hay una API pública disponible.
No hay forma de que sepa borrar manualmente esta caché administrada de iOS. En general, esto es una pista falsa. Cuando el os maneje algo para ti, no necesitas preocuparte por ello. Siempre y cuando esté liberando correctamente todo lo que aloca / retenga y maneje las advertencias de memoria de forma adecuada, está haciendo su parte.
Respuesta tomada de Kevin Low comment
Si puede usar API privadas (como en una aplicación AdHoc, por ejemplo), use este método UIImage
para eliminar todas las imágenes de la memoria caché
[UIImage _flushSharedImageCache];