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

时间:2012-02-07 06:13:34

标签: iphone objective-c performance image nsbundle

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

[UIImage imageNamed: "image.png"];

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

最好的问候

4 个答案:

答案 0 :(得分:13)

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

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

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

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

简而言之,有许多注意事项,但如果您使用了适当的缩放资产,则缓存通常是正确的选择。

如果您的资产规模不正确,则问题更为根本 - 如果您遇到性能问题,则应调整捆绑资产的大小以适合此目的。尺寸合适的图像也可以使绘图更加简单,同时保持最佳图像质量。

答案 1 :(得分:10)

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

答案 2 :(得分:7)

如果您想尝试加载图像而不进行缓存,可以使用:

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

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

答案 3 :(得分:0)

使用NSBundle

查找单个资源文件
NSBundle* myBundle = [NSBundle mainBundle];

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

并查找多个资源:

NSBundle* myBundle = [NSBundle mainBundle];

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