ImageIO脏内存不会被iOS自动清除

前端之家收集整理的这篇文章主要介绍了ImageIO脏内存不会被iOS自动清除前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在创建一种应用程序,它是一种图库 – 它将不同的媒体内容显示为全屏查看器.分配仪器显示,使用应用程序时,Live Bytes参数不会高于40 Mb.同时应用程序在我滑动页面20-30次之后被杀死了100%.
我检查了Dirty Memory参数,发现它比Live Bytes大小了10倍.
而大部分的脏内存消耗了图像IO:
Screenshot http://i40.tinypic.com/25ge51i.jpg

编辑,另一个截图:
Screenshot http://i40.tinypic.com/9t1mh5.png

以上分配峰值是切换视频/图像媒体内容.
问题是脏内存几乎线性增长,我需要以某种方式释放它.

现在关于应用设计.
应用程序屏幕有一个水平滚动视图.滚动视图包含包含多个图像的视频或拼贴对象.为了节省内存,只能一次创建三页 – 当前页面和左/右页面.因此,当滑动滚动视图时,页面总是创建并移动.

使用[UIImage imageWithContentOfFile:path]方法加载的所有图像.
拼贴对象将UIImage实例存储在imagesArray中.在dealloc方法中,imagesArray属性被清除.

所以问题:

> [UIImage imageWithContentOfFile?]中有一种系统错误吗?
>是图像IO缓存吗?
>可以清除吗?

解决方法

把这里放在一个太大的评论,只是一些想法:

1)错误地保留对象的一种方法是将视图中的对象隐藏起来,但不会从它们的超级视图中删除(因此保留)

2)如果你在任何线程上执行UIImageView等任何事情,主线程都不会发生坏事(像这样)

3)复制你的项目,你可以自由地混淆它,并尝试一堆事情:

>而不是多个图像,总是加载相同的图像,但是保留代码的其他部分,因为它们是变化的 –
>在您创建的任何子类中,将保存/保留图像,将一个日志消息放在dealloc中,以查看实际上这些对象是否被执行.
>子类UIImageView,用于图像,并记录dealloc
>子类UIImage,用于这些图像,记录dealloc

4)我很难相信,imageio有一个缺陷,可以做到这一点,但你可以做的是切换到使用imageWithData,并自己加载数据.在实际读取数据时使用F_NOCACHE标志 – 有关SO的其他代码,如何做到这一点,您可以搜索它(我回答了一个问题).

如果您可以创建一个具有此缺陷的演示项目,那么调试它将会比仅仅猜测要怎样.记录获取dealloc’d的类很长一段时间,因为您将立即看到什么没有被释放,然后更好地关注问题.

猜你在找的iOS相关文章