我有一个图像繁重的应用程序,我使用 UIImageView+AFNetworking 类别下载图像。
我注意到随着我加载越来越多的图像,我的内存占用量会继续增加。当我最终收到内存通知时,它没有释放任何内存 - 因此应用程序崩溃了。
我对此的理解是 AFNetworking 使用了一个名为 AFImageCache
的 NSCache
子类,它应该自己处理内存警告。 Link 1 Link 2
通过一些肮脏的技巧,我手动清除了共享缓存中的所有对象,并看到内存分配显着减少。如果不手动执行此调用,这似乎永远不会发生。
我在一个简单的应用程序中复制了这一点,该应用程序下载了 Imgur 的首页并将其显示在一个简单的表格 View 中。您可以在上面看到为应用程序完成的分配分析。
我试图删除任何花哨的东西,但代码在某些地方很乱。它不包括我的脏黑客,所以它只是在内存警告时死掉。你可以看到申请here .
您需要在 imgur 设置一个应用程序才能使用它。
阅读 github 问题 Mattt 似乎表明它应该足够并且完全 self 维护,只要您为传入的 NSURLRequest 设置适当的缓存策略。我可能会遗漏一些东西,但我不确定什么缓存我会制定的政策。这似乎都是为了重新获取更改的图像而不是为了内存而清除。
我也认为lieven 在这个issue 中触及了同样的问题。说除非设置了totalCostLimit,否则缓存不会 self 清理。虽然我不相信在这种情况下使用模拟器与模拟内存警告配对,但症状是一样的。
感谢您对调试此问题的任何帮助
编辑
从
添加建议代码后的分析更新
最佳答案
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 - AFNetworking 图像缓存在内存警告中未清空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21540399/