我正在创建一个应用程序,它是一种画廊 - 它作为全屏查看器显示不同的媒体内容。分配工具显示,使用应用程序时,Live Bytes 参数不会增长到高于 40 Mb。同时,在我滑动页面 20-30 次后,该应用程序 100% 被杀死。
我检查了 Dirty Memory 参数,发现它比 Live Bytes 大小大 10 倍。
大部分脏内存消耗了 Image IO:
编辑,另一个屏幕截图:
上面的分配峰值是切换视频/图像媒体内容。
问题是脏内存几乎线性增长,我需要以某种方式释放它。
现在谈谈应用程序设计。
应用程序屏幕有一个水平滚动视图。滚动视图包含视频或包含多个图像的拼贴对象。为了节省内存,一次仅创建三个页面 - 当前页面和左/右页面。因此,当滑动滚动视图时,页面总是动态创建和删除。
我加载的所有图像都使用[UIImage imageWithContentOfFile: path]
方法。
Collage 对象将 UIImage 实例存储在 imagesArray 中。在 dealloc 方法中,imagesArray 属性被清除。
那么,问题:
- 这是一种系统错误吗
[UIImage imageWithContentOfFile?]
- 是图像IO缓存吗?
- 我可以清除它吗?
把这个放在这里太大了,无法发表评论,只是一些想法:
1)错误地保留对象的一种方法是将对象隐藏在视图中,但未从其超级视图中删除(因此保持保留状态)
2)如果你在任何线程而不是主线程上对 UIImageView 等做任何事情,就会发生不好的事情(像这样)
3)复制你的项目,这样你就可以自由地修改它,并尝试一些事情:
不要加载多个图像,而是始终加载相同的图像,但保留代码的其他部分不变 - 情况会发生变化吗?
在您创建的任何保存/保留图像的子类中,在 dealloc 中放置一条日志消息,以查看这些对象实际上是否正在被释放。
子类 UIImageView,将其用于图像,并记录 dealloc
子类 UIImage,将其用于这些图像,记录 dealloc
4)我很难相信 imageio 有一个缺陷可以做到这一点,但你可以做的是切换到使用 imageWithData,并自己加载数据。当您实际读取数据时,请使用 F_NOCACHE 标志 - 还有其他关于如何执行此操作的代码,您可以搜索它(我回答了一个关于它的问题)。
如果您可以创建一个具有此缺陷的演示项目,那么调试它会比仅仅猜测要做什么容易得多。记录被释放的类会大有帮助,因为您将立即看到哪些内容没有被释放,然后更好地关注问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)