大家好,我遇到一个很奇怪的问题:实际内存只有20M左右,但当打开新界面,使用SDWebImage下载图片后,实际内存不怎么变化,虚拟内存增加很多,操作多次后,虚拟内存350M左右,程序崩溃。求解。 iOS版本为7.1.1
图片尺寸?
1楼 @tinyfool 这个和图片尺寸有关系吗?谢谢。
2楼 @maoyu 有没有关系,你先提供信息,别人才好帮你诊断……
1楼 @tinyfool 图片尺寸比较大,大概有640640的,也有1000多1000多
3楼 @tinyfool 我刚问后台的同事,服务器原图也有2000多乘2000多像素的图片
5楼 @maoyu 这样的话,多半就是这个问题了,一般的图片库会把图片读到内存,不要看2000*2000在文件上不大,但是解压成内存图片以后就很大了。你的问题是你要怎么处理图片,要根据这个来设计流程,不要直接load这么大的图片
当然诊断的最好办法是学好instrument
6楼 @tinyfool 但是为什么不占用实际内存,而是占用虚拟内存呢?
7楼 @tinyfool 我是在instrument下进行查看的,实际内存不怎么变,虚拟内存变的很快。谢谢你,我再了解下instrument.
8楼 @maoyu 直接问这种问题意义不大,如果你对虚拟内存和实际内存的机理不懂的话,简单的说,就是这个图形库写的还不错,实现考虑到了图片可能很大,尽量不用实际内存,因为实际内存往往比虚拟的小,但是你的图片太大了,连虚拟的都放不下了。
10楼 @tinyfool 这个库当内存不足时,会清空缓存在内存中的图片,但清空时,从instrument看,只是实际内存减少了一点,而虚拟内存大小没怎么变化。我再看下这个库的源代码。谢谢您!
10楼 @tinyfool 这个库直接使用的是NSCache进行存储图片的。
10楼 @tinyfool 我把图片下载下来,不显示在UIImageView里,虚拟内存和实际内存变化不大,一旦显示在UIImageView上虚拟内存增大很快,返回这个界面后,内存也不将。我项目使用的ARC
13楼 @maoyu 这些都是你问问题要说的,不能让别人帮你猜,而且你图片的用途是什么都要说,这涉及到不同的处理方式
这种问题最好写个可以稳定重现的demo放到github上。。。
14楼 @tinyfool 恩。不好意思。我有个图片列表页显示的是缩略图,点击某张图片进入详情界面,详情界面显示的是原图,原图分辨率是32642448,显示到UIImageView后,虚拟内存增加了30M左右,而且返回列表页,内存并没有降,即使报内存警告不足时,也不降。我看官方资料说,UIImage最好是10241024以下。现在服务器那边的同事,说把图片分辨率降低,但是降低后,这个问题是否存在,我感觉还是存在。
17楼 @pinxue 谢谢。我刚在详情界面返回时,在viewDidDisappear中调用cell.shopImageView.image = nil;当app报内存不足时,内存降下来了,之前不会降。我使用的是ARC模式,cell.shopImageView.image = nil这条语句应该没有写的道理啊。按理说,详情界面中的这个_cell资源应该会自动释放的啊?
17楼 @pinxue 我是使用performSegueWithIdentifier方式打开详情界面的。详情界面放了一UITableView,里面两个自定义Cell
15楼 @terryso 这个问题解决了,我一定把结果发布出来。
@terryso @pinxue @tinyfool 感谢大家的帮助!问题解决了,原因是 自定义Cell中我写了一个delegate,定义delegate属性时写成了strong,导致controller资源一直释放不掉。再次谢谢大家。