iOS-UIImage imageWithContentsOfFile 和 imageName 对比

来源:互联网 发布:淘宝最好的外贸原单店 编辑:程序博客网 时间:2024/04/19 09:02

1.imageWithContentsOfFile

NSString *imagePath = [NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle] resourcePath],@"icon.png"];        UIImage *imageI = [UIImage imageWithContentsOfFile:imagePath];

imageWithContentsOfFile的方式,在使用完成之后系统会释放,不会缓存下来,所以也就没有这样的问题。一般也不会把所有的图片都会缓存。有些图片在应用中只使用一两次的,就可以用这样的方式,比如新手引导界面的图片等等,就适合这样的方式。没有明显的界限。

2.imageName

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

imageName的方式会在使用的时候系统会cache,程序员是无法处理cache,这是由系统自动处理的,对于重复加载的图像,速度会提升很多,这样反而用户体验好。所以如果某张图片需要在应用中使用多次,或者重复引用,使用imageName的方式会更好,
所以,在app中一些经常会使用的,需要重复加载的,使用imageName会提升用户体验!

Apple的官方文档:

imageNamed: 这个方法用一个指定的名字在系统缓存中查找并返回一个图片对象如果它存在的话。如果缓存中没有找到相应的图片,这个方法从指定的文档中加载然后缓存并返回这个对象。因此imageNamed的优点是当加载时会缓存图片。所以当图片会频繁的使用时,那么用imageNamed的方法会比较好。例如:你需要在 一个TableView里的TableViewCell里都加载同样一个图标,那么用imageNamed加载图像效率很高。系统会把那个图标Cache到内存,在TableViewCell里每次利用那个图 像的时候,只会把图片指针指向同一块内存。正是因此使用imageNamed会缓存图片,即将图片的数据放在内存中,iOS的内存非常珍贵并且在内存消耗过大时,会强制释放内存,即会遇到memory warnings。而在iOS系统里面释放图像的内存是一件比较麻烦的事情,有可能会造成内存泄漏。例如:当一 个UIView对象的animationImages是一个装有UIImage对象动态数组NSMutableArray,并进行逐帧动画。当使用imageNamed的方式加载图像到一个动态数组NSMutableArray,这将会很有可能造成内存泄露。原因很显然的。

imageWithContentsOfFile:仅加载图片,图像数据不会缓存。因此对于较大的图片以及使用情况较少时,那就可以用该方法,降低内存消耗。

一、加载图片问题
UIImage image = [UIImage imageNamed:imageFileName];

这种图片加载方式带有图片缓存的功能,使用这种方式加载图片后,图片会自动加入系统缓存中,并不会立即释放到内存。一些资源使程序中经常使用的图片资源,

使用这种方式会加快程序的运行减少IO操作,但对于项目中只用到一次的图片,如果采用这种方案加载,会增导致程序的内存使用增加。

以下为官方对此方法的解释说明:

imageNamed:

Returns the image object associated with the specified filename.

  • (UIImage )imageNamed:( NSString ) name
    Parameters

name
The name of the file. If this is the first time the image is being loaded, the method looks for an image with the specified name in the application’s main bundle.

Return Value

The image object for the specified file, or nil if the method could not find the specified image.

Discussion

This method looks in the system caches for an image object with the specified name and returns that object if it exists. If a matching image object is not already

in the cache, this method loads the image data from the specified file, caches it, and then returns the resulting object.

二、非缓存的加载方式
+ (UIImage )imageWithContentsOfFile:(NSString )path

  • (UIImage )imageWithData:(NSData )data

三、何时使用imageNamed方法

1、采用imageNamed方法的图片加载情况

图片资源反复使用到,如按钮背景图片的蓝色背景,这些图片要经常用到,而且占用内存少

2、不应该采用的情况:

(1)图片一般只使用一次,如一些用户的照片资源

(2)图片资源较大,加载到内存后,比较耗费内存资源

0 0
原创粉丝点击