AFNetworking La caching de imágenes no se vacía en la advertencia de memory

Tengo una aplicación de image pesada donde descargo imágenes usando la categoría UIImageView + AFNetworking.

Noté que mi huella de memory seguiría aumentando a medida que cargué más y más imágenes. Cuando finalmente recibí una notificación de memory, no liberó ninguna memory y, por lo tanto, la aplicación se bloqueó. Mi entendimiento de esto es que AFNetworking usa una subclass de NSCache llamada AFImageCache que debe manejar las advertencias de memory por sí mismo. Enlace 1 Enlace 2

Con algunos hacks sucios, borré manualmente todos los objects del caching compartido y vi una disminución significativa en las asignaciones de memory. Esto nunca parece suceder sin realizar manualmente esta llamada.

Instrumentos de asignación

He duplicado esto en una aplicación simple que descarga la página principal de Imgur y la muestra en una vista de tabla simple. Arriba puede ver el perfil de asignación realizado para la aplicación.

He tratado de eliminar cualquier cosa elegante y el código es desorderado en algunos lugares. No incluye mi truco sucio, así que simplemente muere ante las advertencias de la memory. Puedes ver la aplicación aquí .

Necesita configurar una aplicación en imgur para usarlo.

Al leer los problemas de github, Mattt parece indicar que debería ser suficiente y mantenerse por completo, siempre y cuando establezca una política de caching adecuada para la NSURLRequest que pase. Puede que me falte algo, pero no estoy seguro de qué política de caching haría set. Todo parece referirse a volver a search imágenes cambiadas en lugar de borrar por el bien de la memory.

También creo que Lieven está tocando el mismo problema en este problema que dice que a less que el totalCostLimit esté configurado, el caching no se auto limpie. Aunque no confío en usar el simulador combinado con advertencias simuladas de memory en casos como estos, los síntomas son los mismos.

Aprecio cualquier ayuda para depurar esto

Editar

Actualización de perfiles después de agregar el código sugerido de

introduzca la descripción de la imagen aquí

La memory caching de imágenes de AFNetworking usa NSCache, que borra la presión de la memory en todo el sistema, pero no la advertencia de memory de una aplicación individual.

Para abordar esto, la twig 2.x de AFNetworking agregó este código:

 [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidReceiveMemoryWarningNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * __unused notification) { [_af_defaultImageCache removeAllObjects]; }]; 

que borrará el caching en una advertencia de memory.

Si todavía está en la twig 1.x , este código no está incluido ( ACTUALIZACIÓN: se ha agregado en esta confirmación ), lo que puede provocar el comportamiento que ve. Puede actualizar a 2.x, o simplemente agregar este código a su aplicación.

debería ser suficiente y mantenerse por completo, siempre y cuando establezca la política de caching adecuada para la NSURLRequest que pase

Tenga en count que NSCache y NSURLCache son dos classs muy diferentes. NSCache es el que está buscando en su pregunta. NSURLCache, por otro lado, solo almacena en caching las respuestas a las requestes de carga de URL.

UIImageView + AFNetworking usa NSCache para almacenar objects UIImage. NSURLCache almacena NS Los objects de datos y la recuperación de objects de este caching generalmente no son lo suficientemente eficaces para aplicaciones con gran cantidad de imágenes que muestran imágenes en un UITableView o UICollectionView.

Finalmente, es posible que desee comparar su implementación con una que utiliza el proyecto SDWebImage . SDWebImage ofrece almacenamiento en caching de disco y memory, y le brinda mucho más control sobre los detalles que UIImageView + AFNetworking de AFNetworking.

AFNetworking ahora tiene esta corrección comprometida con su twig 1.x y con su twig 2.x. Ya no es necesario actualizar a AFNetworking 2.x para solucionar el problema. Ya no es necesario editar UIImageView + AFNetworking.m.

Aquí está el compromiso: https://github.com/AFNetworking/AFNetworking/commit/66a29256ed0724e8c9033ee4847e1f09f800ce42#diff-d41d8cd98f00b204e9800998ecf8427e

Puede ver la versión fija del file aquí: https://github.com/AFNetworking/AFNetworking/blob/1.x/AFNetworking/UIImageView%2BAFNetworking.m