4

ObjectiveC中的黑白imageNamedimageWithContentsOfFile有什么区别

4

3 回答 3

18

imageNamed: imageNamed 缓存了您的图像,并且您失去了对内存的控制 - 不能保证释放对象实际上会释放图像,但确实会在第二次缓存时提供更快的图像加载。如果您正在使用 Interface Builder,并在 Image View Attributes 中设置图像,那也等于 imageNamed 方法。应用程序运行时图像将立即缓存

imageWithContentsOfFile : imageWithContentsOfFile 不缓存图像并且对内存更友好,但是因为它不缓存图像并且加载速度要慢得多。imageWithContentsOfFile: 要求您输入完整路径。我不明白为什么不推荐 imageNamed:,除了您无法访问应用程序包之外的文件这一事实。

于 2013-07-10T11:54:27.470 回答
3

有一个很好的链接,它解释了这两种方法的区别 b/w image named-vs-image 与文件的内容

于 2013-07-10T11:45:35.233 回答
1

这个 SO 链接

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

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

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

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

也请查看链接。

于 2013-07-10T11:39:29.487 回答