英语轻松读发新版了,欢迎下载、更新

虚拟内存不足,程序崩溃

maoyu 发布于 2014年05月06日
无人欣赏。

大家好,我遇到一个很奇怪的问题:实际内存只有20M左右,但当打开新界面,使用SDWebImage下载图片后,实际内存不怎么变化,虚拟内存增加很多,操作多次后,虚拟内存350M左右,程序崩溃。求解。 iOS版本为7.1.1

共21条回复
tinyfool 回复于 2014年05月06日

图片尺寸?

maoyu 回复于 2014年05月06日

1楼 @tinyfool 这个和图片尺寸有关系吗?谢谢。

tinyfool 回复于 2014年05月06日

2楼 @maoyu 有没有关系,你先提供信息,别人才好帮你诊断……

maoyu 回复于 2014年05月06日

1楼 @tinyfool 图片尺寸比较大,大概有640640的,也有1000多1000多

maoyu 回复于 2014年05月06日

3楼 @tinyfool 我刚问后台的同事,服务器原图也有2000多乘2000多像素的图片

tinyfool 回复于 2014年05月06日

5楼 @maoyu 这样的话,多半就是这个问题了,一般的图片库会把图片读到内存,不要看2000*2000在文件上不大,但是解压成内存图片以后就很大了。你的问题是你要怎么处理图片,要根据这个来设计流程,不要直接load这么大的图片

tinyfool 回复于 2014年05月06日

当然诊断的最好办法是学好instrument

maoyu 回复于 2014年05月06日

6楼 @tinyfool 但是为什么不占用实际内存,而是占用虚拟内存呢?

maoyu 回复于 2014年05月06日

7楼 @tinyfool 我是在instrument下进行查看的,实际内存不怎么变,虚拟内存变的很快。谢谢你,我再了解下instrument.

tinyfool 回复于 2014年05月06日

8楼 @maoyu 直接问这种问题意义不大,如果你对虚拟内存和实际内存的机理不懂的话,简单的说,就是这个图形库写的还不错,实现考虑到了图片可能很大,尽量不用实际内存,因为实际内存往往比虚拟的小,但是你的图片太大了,连虚拟的都放不下了。

maoyu 回复于 2014年05月06日

10楼 @tinyfool 这个库当内存不足时,会清空缓存在内存中的图片,但清空时,从instrument看,只是实际内存减少了一点,而虚拟内存大小没怎么变化。我再看下这个库的源代码。谢谢您!

maoyu 回复于 2014年05月06日

10楼 @tinyfool 这个库直接使用的是NSCache进行存储图片的。

maoyu 回复于 2014年05月06日

10楼 @tinyfool 我把图片下载下来,不显示在UIImageView里,虚拟内存和实际内存变化不大,一旦显示在UIImageView上虚拟内存增大很快,返回这个界面后,内存也不将。我项目使用的ARC

tinyfool 回复于 2014年05月06日

13楼 @maoyu 这些都是你问问题要说的,不能让别人帮你猜,而且你图片的用途是什么都要说,这涉及到不同的处理方式

terryso 回复于 2014年05月06日

这种问题最好写个可以稳定重现的demo放到github上。。。

maoyu 回复于 2014年05月06日

14楼 @tinyfool 恩。不好意思。我有个图片列表页显示的是缩略图,点击某张图片进入详情界面,详情界面显示的是原图,原图分辨率是32642448,显示到UIImageView后,虚拟内存增加了30M左右,而且返回列表页,内存并没有降,即使报内存警告不足时,也不降。我看官方资料说,UIImage最好是10241024以下。现在服务器那边的同事,说把图片分辨率降低,但是降低后,这个问题是否存在,我感觉还是存在。

pinxue 回复于 2014年05月06日
  1. 我记得 SDWebImage 是将图像转成 data 后缓存的,所以应该跟它没啥关系。
  2. 3k2k = 6M pixel, 6rgba = 24M byte,所以显示时占用的内存看着很正常。
  3. 返回后图片所占内存应该会放掉,可以在显示图片的 View Controller 里确认一下 dealloc 是不是被执行到了。
  4. Instruments 应该很容易确定是谁还占着内存。
maoyu 回复于 2014年05月06日

17楼 @pinxue 谢谢。我刚在详情界面返回时,在viewDidDisappear中调用cell.shopImageView.image = nil;当app报内存不足时,内存降下来了,之前不会降。我使用的是ARC模式,cell.shopImageView.image = nil这条语句应该没有写的道理啊。按理说,详情界面中的这个_cell资源应该会自动释放的啊?

maoyu 回复于 2014年05月06日

17楼 @pinxue 我是使用performSegueWithIdentifier方式打开详情界面的。详情界面放了一UITableView,里面两个自定义Cell

maoyu 回复于 2014年05月06日

15楼 @terryso 这个问题解决了,我一定把结果发布出来。

maoyu 回复于 2014年05月07日

@terryso @pinxue @tinyfool 感谢大家的帮助!问题解决了,原因是 自定义Cell中我写了一个delegate,定义delegate属性时写成了strong,导致controller资源一直释放不掉。再次谢谢大家。

本帖有21个回复,因为您没有注册或者登录本站,所以,只能看到本帖的10条回复。如果想看到全部回复,请注册或者登录本站。

登录 或者 注册
[顶 楼]
|
|
[底 楼]
|
|
[首 页]