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

Aqu*_*eel 16 iphone performance image objective-c nsbundle

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

[UIImage imageNamed: "image.png"];
Run Code Online (Sandbox Code Playgroud)

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

最好的祝福

jus*_*tin 13

如果有一个真正的"最佳方式",则不存在以多种方式加载图像的方法(除非由于历史原因).因此,一点点理解将比向"最佳方式"提炼答案更好.

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

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

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

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

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


小智 10

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"myimage" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:filePath];
Run Code Online (Sandbox Code Playgroud)


UIA*_*dam 7

如果要在不缓存的情况下尝试加载图像,可以使用:

[[UIImage alloc] initWithContentsOfFile:@"image.png"]; 
Run Code Online (Sandbox Code Playgroud)

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