imageNamed 和 imageWithContentsOfFile 的区别

4

ObjectiveC中imageNamedimageWithContentsOfFile有什么区别?


2
嗯,它们是不同的方法。我相信文档在这种情况下很有用(像往常一样)。 - user529758
2
问题并不宽泛。它可能没有表达得很清楚,但是它非常具体。然而,它可能会被标记为Matthias Bauch上面提出的问题的重复。 - WolfLink
3个回答

17

imageNamed: imageNamed方法会缓存你的图片,但你失去了对内存的控制——释放对象并不一定能释放图片,但是这种方法可以提供更快的第二次加载图片速度,因为它们已经被缓存了。如果你使用Interface Builder,并在Image View Attributes中设置图片,那么也等同于imageNamed方法。当应用程序运行时,图片将立即被缓存。

imageWithContentsOfFile: imageWithContentsOfFile不会缓存图片,所以对内存更加友好,但是由于它不会缓存图片,所以加载速度会慢得多。imageWithContentsOfFile需要你输入完整的路径。我不明白为什么不推荐使用imageNamed方法,除了你无法访问应用程序包之外。


1
“从不释放内存”这句话并不正确。 - Matthias Bauch
@MatthiasBauch:我已经编辑了,现在可以了吗? - Alex

3

1

来自 这个 SO 链接

UIImage的方法imageNamed:和imageWithContentsOfFile:做了稍微不同的事情。imageNamed在一个特殊的系统缓存中加载图像,然后使用该图像路径进行的未来调用将从缓存中返回图像,而不是重新从磁盘加载它。imageWithContentsOfFile只是简单地加载您指定路径处的图像,但不进行缓存。对于相同的图像进行多次imageWithContentsOfFile调用将导致内存中出现多个副本。iOS似乎不会在发出内存警告时清空缓存(或根本不清空,我不确定),这可能导致应用程序由于缺少可用内存而终止。使用imageWithContentsOfFile加载的UIImages通过在需要时清除其图像并重新加载来响应内存警告,这可能解释了为什么您的内存峰值消失了。此外,模拟器中的缓存似乎比实际硬件中的缓存要大得多,我使用imageNamed遇到的问题和崩溃仅发生在设备上。在模拟器上进行测试时要小心!我唯一能想到使用imageNamed的原因是在您的视图中多次使用相同的图像。或者,您可以实现自己的图像缓存,并获得控制缓存的好处,如此处所述:http://www.alexcurylo.com/blog/2009/01/13/imagenamed-is-evil/

也请查看this链接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接