iOS不会自动清除ImageIO脏内存

问题描述 投票:16回答:2

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

Screenshot http://i40.tinypic.com/25ge51i.jpg

编辑,另一个截图:

Screenshot http://i40.tinypic.com/9t1mh5.png

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

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

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

所以,问题:

  • 它是[UIImage imageWithContentOfFile?]中的一种系统错误
  • 它是Image IO缓存吗?
  • 我可以清除它吗?
ios memory-management memory-leaks uiimage javax.imageio
2个回答
21
投票

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

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

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

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

  • 而不是多个图像,总是加载相同的图像,但保持代码的其他部分 - 事情是否改变?
  • 在您创建的任何保存/保留图像的子类中,在dealloc中放置一条日志消息,以查看实际上这些对象是否已被解除分配。
  • 子类UIImageView,将其用于图像,并记录dealloc
  • 子类UIImage,将它用于这些图像,记录dealloc

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

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


2
投票

除了David H的回答之外,我建议任何遇到此问题的人也要检查你的View Controller's,Model's,UIDocument(如果你使用的话)deinitializers是否在不需要时被调用。

如果你没有正确释放这些类并且它们包含UIKit引用它的图像/ VDO /内容数据,那么这可能会导致这种情况下你看到VM: ImageIO内存使用量总是在增加,但你看到没有内存泄漏使用仪器,因为这些内容现在由UIKit内部保留。

我也经历过这个问题,两次,而在我的情况下,事实证明,由于无关的问题,我的模型的deinitializer从未被调用过。通过解决这些无关的问题并确保我的模型被解除分配,这些VM: ImageIO持续增长消失了。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.