imageNamed有什么优势?

时间:2015-01-07 21:07:08

标签: ios cocoa-touch caching uiimage

我知道加载像这样的图像

  UIImage *image = [UIImage imageNamed:@"img"];

将缓存图像并加载它,就像这样

  UIImage *image = [UIImage imageWithContentsOfFile:@"img.png"];

人们说访问缓存图像会更快,因为iOS会从内存中访问它,我们不会有读取和解码文件的开销。好的,我明白了,但是假设我使用第二个非缓存方法在一个属性的视图上加载图像,就像这样

  UIImage *image = [UIImage imageWithContentsOfFile:@"img.png"];
  self.imageView = [[UIImageView alloc] initWithImage:image];

还没有记忆中的图像吗?如果我想访问它,我只需要执行imageView.image并从内存中获取它。

我可能已经累了,但我无法想象缓存版本的单一用途,或者我不明白这个缓存意味着什么。

小心解释一下?感谢。

2 个答案:

答案 0 :(得分:4)

想象一下,您的图像是您在7个不同视图控制器中使用的图标...您可以加载图像一次然后将其传递给每个VC,或者您可以使用imageNamed ...您的选择。

答案 1 :(得分:0)

来自the documentation

  

此方法在系统缓存中查找具有指定名称的图像对象,并返回该对象(如果存在)。如果匹配的图像对象尚未在缓存中,则此方法将从磁盘或资产catelog中查找并加载图像数据,然后返回结果对象。你不能假设这个方法是线程安全的。

假设您的应用中有图片。当您需要使用图像时,请使用以下代码:

UIImage *image = [UIImage imageWithContentsOfFile:@"img.png"];
然后,iOS将在应用程序包中查找您的图像,将其加载到内存中,然后将其解码为UIImage。

但是,假设您需要使用10个不同的对象才能使用该图像,并按照以下方式加载它:

for (ClassThatNeedsImage *object in objects) {
    object.image = [UIImage imageWithContentsOfFile:@"img.png"];
}

(这不是最好的例子,因为您可以只加载一次图像并将其传递给每个对象。但是,我有更复杂的代码,而这不是一个选项。)

然后,iOS将查找图像10次,将其加载到内存中10次,然后将其解码10次。但是,如果您使用imageNamed:

for (ClassThatNeedsImage *object in objects) {
    object.image = [UIImage imageNamed:@"img"];
}

来自Wikipedia

  

在计算中,缓存是一个透明地存储数据的组件,以便可以更快地提供对该数据的未来请求。

UIImage使用的缓存存储在内存中,访问速度比磁盘快得多。

第一次通过循环,iOS在缓存中查看图像是否存储在那里。假设您之前没有使用imageNamed加载此图像,它找不到它,因此它会查找图像,将其加载到内存中,对其进行解码,然后将其复制到缓存中。

在其他迭代中,iOS查找缓存,查找图像,并将其复制到UIImage对象中,因此根本不需要进行任何硬盘访问。


如果您只想在应用的生命周期内使用一次图像,请使用imageWithContentsOfFile:。如果您要多次使用该图像,请使用imageNamed: