我检查了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的类很长一段时间,因为您将立即看到什么没有被释放,然后更好地关注问题.