我注意到随着我加载越来越多的图像,我的内存占用量将继续增加.当我最终收到内存通知时,它没有释放任何内存 – 因此应用程序崩溃了.
我对此的理解是,AFNetworking使用一个名为AFImageCache的NSCache子类,它应该自己处理内存警告. Link 1 Link 2
有了一些肮脏的黑客攻击,我手动清除了共享缓存中的所有对象,并看到了内存分配的显着减少.如果不手动执行此调用,这似乎永远不会发生.
我在一个简单的应用程序中复制了这个,它下载了Imgur的首页并在简单的tableview中显示它.上面你可以看到为applpication完成的分配分析.
我试图删除任何花哨的东西,代码在某些地方很乱.它不包括我的脏黑客,所以它只是死于内存警告.您可以看到应用程序here.
您需要在imgur上设置应用程序才能使用它.
阅读github问题Mattt似乎表明它应该足够并且完全自我维护,只要你为你传入的NSURLRequest设置适当的缓存策略.我可能会遗漏一些东西,但我不确定我会采用什么缓存策略组.这一切似乎都是为了记忆而改变图像而不是清除图像.
我也认为谎言触及了这个issue中同样的问题,说除非设置了totalCostLimit,否则缓存不会自我清理.虽然我不相信在这种情况下使用模拟器与模拟内存警告配对,但症状是相同的.
我很感激任何帮助调试这个
编辑
解决方法
为解决这个问题,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更能控制细节.