ios - AFNetworking 图像缓存在内存警告中未清空

标签 ios objective-c caching memory afnetworking

我有一个图像繁重的应用程序,我使用 UIImageView+AFNetworking 类别下载图像。

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

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

Allocation instruments

我在一个简单的应用程序中复制了这一点,该应用程序下载了 Imgur 的首页并将其显示在一个简单的表格 View 中。您可以在上面看到为应用程序完成的分配分析。

我试图删除任何花哨的东西,但代码在某些地方很乱。它不包括我的脏黑客,所以它只是在内存警告时死掉。你可以看到申请here .

您需要在 imgur 设置一个应用程序才能使用它。

阅读 github 问题 Mattt 似乎表明它应该足够并且完全 self 维护,只要您为传入的 NSURLRequest 设置适当的缓存策略。我可能会遗漏一些东西,但我不确定什么缓存我会制定的政策。这似乎都是为了重新获取更改的图像而不是为了内存而清除。

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

感谢您对调试此问题的任何帮助

编辑

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

enter image description here

最佳答案

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/

相关文章:

caching - Windows Azure - 角色内缓存、监控

jpa - eclipselink 查询结果缓存不起作用

iphone - 5.0 Base SDK 应用无法安装在 5.1 操作系统的 iPad 上

iphone - 标准 View 和 UITabBarController View 之间的转换?

ios - clang : error: clang frontend command failed with exit code 70 (use -v to see invocation)

ios - 在 Xcode 上的编译时/运行时删除文本标签/按钮

javascript - 永远的 Node.js 缓存问题

ios - Swift 中泛型和 AnyObject 的区别

iphone - 在 iOS 中多个按钮上发出声音并在其他人播放时停止

ruby-on-rails - SHA1 哈希值在我的 Rails 和 Cocoa 应用程序之间不匹配