我有一个图像处理应用程序,使用UIImageView+AFNetworking类别下载图像。
我注意到,随着我加载越来越多的图像,我的内存占用将继续增加。当我最终收到内存通知时,它没有释放任何内存,因此应用程序崩溃了。我对此的理解是,AFNetworking使用了一个名为AFImageCache
的NSCache
子类,它应该自己处理内存警告。链接1 链接2
使用一些脏的黑客,我手动清除了共享缓存中的所有对象,并且看到内存分配显著减少。如果不手动执行此调用,这种情况似乎永远不会发生。
我在一个简单的应用程序中复制了这个例子,该应用程序下载Imgur的首页并在一个简单的表视图中显示它。在上面,您可以看到为鼓掌所做的分配分析。
我试着删除任何花哨的东西,而且代码在某些地方很混乱。它不包括我的脏黑客,所以它只是死在内存警告。您可以看到应用程序这里。
要使用该应用程序,您需要在imgur设置一个应用程序。
阅读github似乎表明,只要您为传入的NSURLRequest设置了适当的缓存策略,它就应该是足够的和完全自我维护的。我可能遗漏了什么,但我不确定我会设置什么缓存策略。这一切似乎都是为了记忆而重新抓取更改的图像,而不是清除。
我还认为lieven在这个问题中也提到了同样的问题,他说,除非设置totalCostLimit,否则缓存将无法自我清理。虽然我不相信在这种情况下使用仿真器与模拟内存警告相结合,但症状是一样的。
我很感谢你帮我调试这个
编辑
添加建议的代码后进行分析更新。
发布于 2014-02-03 16:05:54
AFNetworking的图像缓存使用NSCache,它可以清除整个系统的内存压力,而不是单个应用程序的内存警告。
为了解决这个问题,2. AFNetworking的X分支添加了以下代码:
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidReceiveMemoryWarningNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * __unused notification) {
[_af_defaultImageCache removeAllObjects];
}];
这将清除内存警告上的缓存。
如果您仍然在1.x分支上,则不包含此代码(UPDATE: --它是在此承诺中添加的),这可能会导致您看到的行为。您可以更新到2.x,也可以将这些代码添加到应用程序中。
只要您将适当的缓存策略设置为传入的NSURLRequest,它就应该是足够和完全自我维护的。
请注意,NSCache和NSURLCache是两个非常不同的类。NSCache是你在问题中要找的那个人。另一方面,NSURLCache只缓存对URL请求的响应。
UIImageView+AFNetworking使用NSCache存储UIImage对象。NSURLCache存储NSData对象,从这个缓存中检索对象通常不能满足在UITableView或UICollectionView中显示图像的图像处理应用程序的要求。
最后,您可能希望将您的实现与使用SDWebImage项目的实现进行比较。SDWebImage提供磁盘和内存缓存,并且比AFNetworking的UIImageView+AFNetworking更能控制细节。
发布于 2014-08-20 17:02:44
AFNetworking现在已经将此修复提交到其1.x分支和2.x分支。不再需要升级到AFNetworking 2.x来解决这个问题。您也不再需要编辑UIImageView+AFNetworking.m了。
您可以在这里看到该文件的固定版本:https://github.com/AFNetworking/AFNetworking/blob/1.x/AFNetworking/UIImageView%2BAFNetworking.m
https://stackoverflow.com/questions/21540399
复制相似问题