我有一个图像繁重的应用程序,我使用 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/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
我的模型有defself.empty_building//stuffend我怎样才能对这个现有的进行rspec?,已经尝试过:describe"empty_building"dosubject{Building.new}it{shouldrespond_to:empty_building}endbutgetting:Failure/Error:it{shouldrespond_to:empty_building}expected#torespondto:empty_building 最佳答案 你有一个类方法self.empty_bu
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path