主帖 21 条回复 虚拟内存不足,程序崩溃 maoyu · 2014年05月06日 · 阅读 3 · 无人欣赏。 大家好,我遇到一个很奇怪的问题:实际内存只有20M左右,但当打开新界面,使用SDWebImage下载图片后,实际内存不怎么变化,虚拟内存增加很多,操作多次后,虚拟内存350M左右,程序崩溃。求解。 iOS版本为7.1.1
#6 tinyfool 2014年05月06日 5楼 @maoyu 这样的话,多半就是这个问题了,一般的图片库会把图片读到内存,不要看2000*2000在文件上不大,但是解压成内存图片以后就很大了。你的问题是你要怎么处理图片,要根据这个来设计流程,不要直接load这么大的图片 欣赏 0 反对 0 回复本楼
#9 maoyu 2014年05月06日 7楼 @tinyfool 我是在instrument下进行查看的,实际内存不怎么变,虚拟内存变的很快。谢谢你,我再了解下instrument. 欣赏 0 反对 0 回复本楼
#10 tinyfool 2014年05月06日 8楼 @maoyu 直接问这种问题意义不大,如果你对虚拟内存和实际内存的机理不懂的话,简单的说,就是这个图形库写的还不错,实现考虑到了图片可能很大,尽量不用实际内存,因为实际内存往往比虚拟的小,但是你的图片太大了,连虚拟的都放不下了。 欣赏 0 反对 0 回复本楼
#11 maoyu 2014年05月06日 10楼 @tinyfool 这个库当内存不足时,会清空缓存在内存中的图片,但清空时,从instrument看,只是实际内存减少了一点,而虚拟内存大小没怎么变化。我再看下这个库的源代码。谢谢您! 欣赏 0 反对 0 回复本楼
#13 maoyu 2014年05月06日 10楼 @tinyfool 我把图片下载下来,不显示在UIImageView里,虚拟内存和实际内存变化不大,一旦显示在UIImageView上虚拟内存增大很快,返回这个界面后,内存也不将。我项目使用的ARC 欣赏 0 反对 0 回复本楼
#16 maoyu 2014年05月06日 14楼 @tinyfool 恩。不好意思。我有个图片列表页显示的是缩略图,点击某张图片进入详情界面,详情界面显示的是原图,原图分辨率是32642448,显示到UIImageView后,虚拟内存增加了30M左右,而且返回列表页,内存并没有降,即使报内存警告不足时,也不降。我看官方资料说,UIImage最好是10241024以下。现在服务器那边的同事,说把图片分辨率降低,但是降低后,这个问题是否存在,我感觉还是存在。 欣赏 0 反对 0 回复本楼
#17 pinxue 2014年05月06日 我记得 SDWebImage 是将图像转成 data 后缓存的,所以应该跟它没啥关系。 3k2k = 6M pixel, 6rgba = 24M byte,所以显示时占用的内存看着很正常。 返回后图片所占内存应该会放掉,可以在显示图片的 View Controller 里确认一下 dealloc 是不是被执行到了。 Instruments 应该很容易确定是谁还占着内存。 欣赏 0 反对 0 回复本楼
#18 maoyu 2014年05月06日 17楼 @pinxue 谢谢。我刚在详情界面返回时,在viewDidDisappear中调用cell.shopImageView.image = nil;当app报内存不足时,内存降下来了,之前不会降。我使用的是ARC模式,cell.shopImageView.image = nil这条语句应该没有写的道理啊。按理说,详情界面中的这个_cell资源应该会自动释放的啊? 欣赏 0 反对 0 回复本楼
#19 maoyu 2014年05月06日 17楼 @pinxue 我是使用performSegueWithIdentifier方式打开详情界面的。详情界面放了一UITableView,里面两个自定义Cell 欣赏 0 反对 0 回复本楼
#21 maoyu 2014年05月07日 @terryso @pinxue @tinyfool 感谢大家的帮助!问题解决了,原因是 自定义Cell中我写了一个delegate,定义delegate属性时写成了strong,导致controller资源一直释放不掉。再次谢谢大家。 欣赏 0 反对 0 回复本楼