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图像从未被释放的主要内容,如果未能解决你的问题,请参考以下文章