【问题标题】:img_data_lock iphone - imageNamed vs imageWithContentsofFileimg_data_lock iphone - imageNamed vs imageWithContentsofFile
【发布时间】:2011-02-23 20:48:06
【问题描述】:

我注意到内存激增,instruments 中列出的负责调用者是 img_data_lock,负责库是 CoreGraphics

我一直在阅读该问题与缓存与未缓存的图像加载有关 (Difference between [UIImage imageNamed...] and [UIImage imageWithData...]?) 目前我的应用通过imageNamed加载一系列图片

imageWithContentsOfFile 替换imageNamed 调用似乎可以解决问题。

有人知道有关 img_data_lock 调用者的任何信息吗? 如果对内存造成如此大的损失,为什么有人会使用imageNamed

【问题讨论】:

  • 你是在设备上测试还是在模拟器上测试?
  • 是的,我正在模拟器上进行测试,但我也在设备上运行了一些测试。我确实让应用程序在广泛使用后崩溃,但也许上述问题不是罪魁祸首。将向您更新更多发现。

标签: iphone memory-management


【解决方案1】:

UIImage 的方法 imageNamed: 和 imageWithContentsOfFile: 做的事情略有不同。 imageNamed 将图像加载到一个特殊的系统缓存中,然后使用该图像路径的未来调用将返回缓存中的图像,而不是从磁盘重新加载它。 imageWithContentsOfFile 只是在您指定的路径加载图像,但不进行缓存。对同一图像多次调用 imageWithContentsOfFile 将导致内存中存在多个副本。

当发出内存警告时,iOS 似乎没有清空缓存(好吧,我不确定),这可能导致应用程序因可用内存不足而终止。使用 imageWithContentsOfFile 加载的 UIImage 通过清除其图像并在需要时重新加载来响应内存警告,这可能解释了为什么您的内存峰值消失了。

此外,模拟器中的缓存似乎比实际硬件中的大得多,我在使用 imageNamed 的 UIImages 中看到的问题和崩溃仅发生在设备上。在模拟器上测试时要小心!

我能看到使用 imageNamed 的唯一原因是同一张图片在您的视图中被多次使用。或者,您可以实现自己的图像缓存,并获得可以控制的缓存的好处,如下所述: http://www.alexcurylo.com/blog/2009/01/13/imagenamed-is-evil/

【讨论】:

    猜你喜欢
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    相关资源
    最近更新 更多