从应用程序包中加载图像的最佳方式

问题描述:

从应用程序主包加载图像的最佳方式是什么?我正在使用从应用程序包中加载图像的最佳方式

[UIImage imageNamed: "image.png"]; 

但我听说这在内存使用情况和性能方面并不好。任何人都可以给他/她的反馈吗?我的应用程序在发布时从主包中读取大量图像。我想让这个过程尽可能高效。

问候

+0

你的意思是:'''[UIImage imageNamed:@“image。png“];'''忘了'''@''':) – 2014-10-18 19:21:39

如果你想尝试加载图像无缓存,可以使用:

[[UIImage alloc] initWithContentsOfFile:@"image.png"]; 

这可能是第一次加载图像的速度稍快,因为它不必先缓存它。如果您只需要使用这些图像一次,那么尝试这种方式可能是有意义的。这样做的另一个好处是,你不会有一个图像缓存占用内存的时间超过了必要的时间。

+0

但是对于很多图像,这不是最好的way ...... – 2012-02-07 06:33:21

+0

问题是关于加载图像时的内存使用情况和性能,而不是从包中获取图像文件列表的最佳方式,如果他有很多图像,那么加载它们的替代方法如果你仔细阅读整个问题,你会得到他想要的答案。 – UIAdam 2012-02-07 06:34:43

+0

大量的图像?你能否详细解释一下,以便我得到清晰的图像?谢谢 – 2012-02-07 06:37:25

为了找到使用一个NSBundle

NSBundle* myBundle = [NSBundle mainBundle]; 

NSString* myImage = [myBundle pathForResource:@"Seagull" ofType:@"jpg"]; 

一个单一的资源文件,并寻找多种资源:

NSBundle* myBundle = [NSBundle mainBundle]; 

NSArray* myImages = [myBundle pathsForResourcesOfType:@"jpg" 
           inDirectory:nil]; 
+0

我不明白这是如何解决这个问题的 – UIAdam 2012-02-07 06:30:19

+0

嗨,我不是在寻找创建图像路径的机制。当我从主包中加载图像时,可以改善内存使用情况和性能 – Aqueel 2012-02-07 06:49:04

+0

亚我知道,如果您有多个图像,第二种方法也是与性能问题相关的更好的方法 – 2012-02-07 06:52:05

如果存在一个真正的“最佳方式”,则不存在以多种方式加载图像的方式(除非出于历史原因)。因此,一点点的理解会比提供“最佳方式”的答案更好地为您服务。

+[UIImage imageNamed:]缓存图像以供重复使用,而且对于大多数目的来说这是一个合理的默认设置。如果使用正确,缓存为优秀。缓存很好,因为它可以通过共享和重新使用加载的图像来最大限度地减少磁盘读取和内存使用量,而不必为每个必须显示的图像读取和分配副本。考虑一下您在多个屏幕上使用的图标图像 - 您是否希望每次读取和重新分配图像数据?这可能导致冗余读取和分配相同的图像数据。如果没有,请使用缓存方法。

如果您只是一次加载图像并且懒洋洋地加载图像,那么您可能需要考虑非缓存方法。

  • 图像数据会消耗大量内存。
  • 读取图像可能需要很长时间 - 不仅仅是磁盘I/O,还要将其转换为可用的UIImage表示形式(例如解压缩图像)。
  • 也有时候您应该调整大小/缩放图像。那么你会想要一个缩放的副本。

简而言之,有很多考虑因素,但如果您正确缩放了您重复使用的资产,缓存通常是正确的选择。

如果您的资产尺寸不合适,那么问题就更为重要 - 如果遇到性能问题,您应该调整捆绑资产以适合用途。适当大小的图像也使绘图更简单,同时保持最佳的图像质量。

+0

谢谢贾斯汀。是的,这就是为什么我想要加载图像的最佳方式。我的应用程序在处理这些图像时需要很多时间,这就是为什么我想知道我是否可以改进我的代码。 – Aqueel 2012-02-07 07:00:40

+0

@Aqueel我刚刚编辑答案,以涵盖使用适当的大小 - 看看。 Justin,你的反馈真的很有帮助。我使用了大约15张大尺寸图片,并在使用之前对其进行缩放,现在我将修复这些图片。再次感谢... – justin 2012-02-07 07:04:26

+0

@Aqueel不客气=) – justin 2012-02-07 07:24:51

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"myimage" ofType:@"png"]; 
UIImage *image = [UIImage imageWithContentsOfFile:filePath];