PNG图像从未被释放

Posted

技术标签:

【中文标题】PNG图像从未被释放【英文标题】:PNG image never deallocated 【发布时间】:2013-12-26 19:19:12 【问题描述】:

内存调试仍然很痛苦。 我使用导航控制器加载了 4 个 VC。每个 VC 都有自己的用于多个控件的 PNG 图像。 在 Instruments 中,我意识到大部分 VM 区域都被 ImageIO_PNG_Data 占用。 当我推送/弹出 VC 时,这些 VM 会增加并且永远不会减少(我假设 dealloc 一些 VC 也会释放图像)。

当然,调试是在模拟器中完成的。

【问题讨论】:

图像数据缓存在独立的缓存系统中,不受dealloc的直接影响。例如,UIImageViews 在那时被释放 - 但图像可以保留在缓存中“以防万一”您再次需要它们。但是,当您的应用收到内存警告时,它们应该被释放。 那么,XCode 5 的 Debug Navigator 中显示的数字是什么意思,heap 还是 total? Zaph,你能回答一下吗? 我不知道。我使用仪器分配和 HeapShot 分析来确定我如何使用内存。有关如何使用 Heapshot 查找内存占用,请参阅:bbum blog 【参考方案1】:

稍微扩展 rokjarc 的评论:

UIImage +imageNamed: 显式缓存。文档指出:

此方法在系统缓存中查找具有 指定名称并返回该对象(如果存在)。如果一个匹配 图像对象尚未在缓存中,此方法加载图像 来自指定文件的数据,缓存它,然后返回 结果对象。

因此,除非或直到其他地方需要内存,否则之前加载的图像将保留在缓存中。不必要地释放内存不会提高效率。

如果您出于任何原因想要避免缓存(我认为无论出于何种虚假原因),您都可以使用+imageWithContentsOfFile:,或普通的init 等效项,从NSBundle 获得完整路径。

据我所知,通过界面构建​​器设置为图像视图和其他位置的 PNG 将通过缓存访问。

【讨论】:

【参考方案2】:

如果 VM 分配没有分配给它们的物理内存,则没有问题。

ios 内存映射文件,并且在任何给定时间都可能没有分配物理内存。一些 VM 分配是由其他应用共享的框架。

您需要注意的是活堆分配,在这种情况下它略高于 4MB。

【讨论】:

以上是关于PNG图像从未被释放的主要内容,如果未能解决你的问题,请参考以下文章

UIImagePickerControllerDelegate 未被调用,所选图像从未显示

从文件中打开图像,然后释放锁定?

用背景颜色填充 png 透明度

在nodejs中加入2图像[关闭]

c++ gdi图像数组

PNG图像输出的标题以确保它在浏览器中被缓存?