【问题标题】:UIImage Caching: Performance Consequences Only?UIImage 缓存:仅影响性能?
【发布时间】:2012-12-27 00:11:12
【问题描述】:

直观地说,我一直觉得使用缓存 UIImage 初始化 (imageNamed) 不仅仅是从磁盘加载时节省时间。我认为这也是一个内存问题:不是让多个不同的UIImage 实例具有相似的数据,而是将数据加载到内存中一次。

使用imageNamed 会提高内存的使用效率吗?

【问题讨论】:

  • 是的,但这并不总是可行的:仅适用于您项目中的文件。其他情况可以使用NSCache
  • @Nekto 谢谢,我实际上在不知道NSCache 的情况下实现了一个缓存...我可能不得不重做。

标签: ios memory-management uiimage


【解决方案1】:

是的,它还可以提高内存使用效率。

根据imageNamed: 文档:

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

这里的关键是它“在系统缓存中查找图像对象”。

为了确认一下,我制作了一个包含五个图像视图和一个按钮的示例项目。当调用imageNamed 五次设置所有五个时,我的堆在 Instruments 中增长了 19.5k。使用imageWithContentsOfFile:,它增长了 66.5k。

【讨论】:

  • 太棒了,感谢您考虑这一点,甚至制作了一个示例项目。我会在一两天内将此标记为已接受的答案,只是想看看这是否是最后一句话。暂时 +1
  • 这很疯狂的是,如果缓存在每次内存警告时都被转储,那么实际上每次警告都会导致内存使用量变差,对吧?
  • 我猜它只是保留它创建的对象,除非没有更多对它的引用,否则它不会释放它,在这种情况下,从内存的角度来看它没有区别。
  • 直到您使用imageNamed 再次创建它并且它没有,因为它发布了它。然后你的内存使用开始增长,因为你有一个内存警告,对吧?
  • 我想说的是,除非没有其他引用它,否则我怀疑他们是否会释放它,因为这样做无论如何都不会减少内存占用,而且只会阻止这种类型的您所描述的情况。
猜你喜欢
  • 2022-08-07
  • 2019-12-12
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 2013-02-24
相关资源
最近更新 更多