ios – AFNetworking图像缓存在内存警告时不会清空

前端之家收集整理的这篇文章主要介绍了ios – AFNetworking图像缓存在内存警告时不会清空前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个图像繁重的应用程序,我使用UI ImageView AFNetworking类别下载图像.

我注意到随着我加载越来越多的图像,我的内存占用量将继续增加.当我最终收到内存通知时,它没有释放任何内存 – 因此应用程序崩溃了.
我对此的理解是,AFNetworking使用一个名为AFImageCache的NSCache子类,它应该自己处理内存警告. Link 1 Link 2

有了一些肮脏的黑客攻击,我手动清除了共享缓存中的所有对象,并看到了内存分配的显着减少.如果不手动执行此调用,这似乎永远不会发生.

我在一个简单的应用程序中复制了这个,它下载了Imgur的首页并在简单的tableview中显示它.上面你可以看到为applpication完成的分配分析.

我试图删除任何花哨的东西,代码在某些地方很乱.它不包括我的脏黑客,所以它只是死于内存警告.您可以看到应用程序here.

您需要在imgur上设置应用程序才能使用它.

阅读github问题Mattt似乎表明它应该足够并且完全自我维护,只要你为你传入的NSURLRequest设置适当的缓存策略.我可能会遗漏一些东西,但我不确定我会采用什么缓存策略组.这一切似乎都是为了记忆而改变图像而不是清除图像.

我也认为谎言触及了这个issue中同样的问题,说除非设置了totalCostLimit,否则缓存不会自我清理.虽然我不相信在这种情况下使用模拟器与模拟内存警告配对,但症状是相同的.

我很感激任何帮助调试这个

编辑

添加建议的代码后的分析更新

解决方法

AFNetworking的图像缓存使用NSCache,它可以清除系统内存压力,但不会清除单个应用程序的内存警告.

解决这个问题,2.x branch of AFNetworking添加了以下代码

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

这将清除内存警告缓存.

如果您仍然在the 1.x branch,则不包含此代码(更新:它已在this commit添加),这可能会导致您看到的行为.您可以更新到2.x,或者只是将此代码添加到您的应用中.

it should be enough and fully self maintaining,as long as you set proper cache policy to the NSURLRequest you pass in

请注意,NSCache和NSURLCache是​​两个非常不同的类. NSCache是​​您在问题中寻找的那个.另一方面,NSURLCache仅缓存对URL加载请求的响应.

UIImageView AFNetworking使用NSCache存储UIImage对象. NSURLCache存储NSData对象,并且从此缓存中检索对象通常对于在UITableView或UICollectionView中显示图像的图像繁重的应用程序而言不够高.

最后,您可能希望将您的实现与使用SDWebImage项目的实现进行比较. SDWebImage提供磁盘和内存缓存,比AFNetworking的UIImageView AFNetworking更能控制细节.

猜你在找的iOS相关文章