iOS不会自动清除ImageIO脏内存

ZAN*_*ZAN 17 memory-leaks memory-management uiimage ios javax.imageio

我正在创建一个应用程序,它是一种图库 - 它将不同的媒体内容显示为全屏查看器.分配工具显示使用应用程序时,实时字节参数不会超过40 Mb.与此同时,在我将页面滑动20-30次后,应用程序被100%杀死.我检查了Dirty Memory参数,发现它比Live Bytes大小大10倍.并且大部分脏内存消耗了Image IO:

截图http://i40.tinypic.com/25ge51i.jpg

编辑,另一个截图:

截图http://i40.tinypic.com/9t1mh5.png

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

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

我使用[UIImage imageWithContentOfFile: path]方法加载的所有图像.Collage对象在imagesArray中存储UIImage实例.在dealloc方法中,清除了图像轮廓属性.

所以,问题:

  • 它是一种系统错误吗? [UIImage imageWithContentOfFile?]
  • 它是Image IO缓存吗?
  • 我可以清除它吗?

Dav*_*d H 22

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

1)错误地保留对象的一种方法是让视图中的对象隐藏但不从超级视图中删除(从而保持不变)

2)如果你在任何线程上使用UIImageView等做任何事情而不是主线程可能会发生坏事(比如这个)

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

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

  • 在您创建的任何保存/保留图像的子类中,在dealloc中放置一条日志消息,以查看实际上这些对象是否已被解除分配.

  • 子类UIImageView,将其用于图像,并记录dealloc

  • 子类UIImage,将它用于这些图像,记录dealloc

4)我很难相信imageio有一个缺陷可以做到这一点,但你可以做的是切换到使用imageWithData,并自己加载数据.当你真正读取数据时使用F_NOCACHE标志 - 在SO上还有其他代码如何执行此操作,你可以搜索它(我回答了一个问题).

如果您可以使用此缺陷创建一个演示项目,那么调试它比调整操作要容易得多.记录获取dealloc的类会有很长的路要走,因为您将立即看到未发布的内容,然后更好地关注问题.