iOS关于加载图片的几种方式选择

11 篇文章 0 订阅

最近在开发过程中遇到一些性能优化的东西,这次来说说关于图片加载的性能优化和选择。

大家都知道创建UIImage常用以下几种方式

+ (nullable UIImage *)imageNamed:(NSString *)name;      // load from main bundle
#if __has_include(<UIKit/UITraitCollection.h>)
+ (nullable UIImage *)imageNamed:(NSString *)name inBundle:(nullable NSBundle *)bundle compatibleWithTraitCollection:(nullable UITraitCollection *)traitCollection NS_AVAILABLE_IOS(8_0);
#endif

+ (nullable UIImage *)imageWithContentsOfFile:(NSString *)path;
+ (nullable UIImage *)imageWithData:(NSData *)data;

简单说一下imageNamed(1),imageWithContentsOfFile(2),imageWithData(3)的区别,以下用1,2 ,3来代替。

On devices with high-resolution screens, the imageNamed:, imageWithContentsOfFile:, and initWithContentsOfFile: methods automatically looks for a version of the requested image with the @2x modifier in its name. If it finds one, it loads that image instead. If you do not provide a high-resolution version of a given image, the image object still loads a standard-resolution image (if one exists) and scales it during drawing. 

以上是苹果文档说明,大概意思就是说第一种和第二种都能自动识别@2x,@3x等不同分辨率的图片

-------------------------------------------------------------------------------------------------

第一种(1)会提供一个缓存,具体是在加载的时候缓存到系统内存,使用的时候从缓存中进行加载,但是过多的话会导致内存泄露等内存警告问题。

imageNamed:后面跟的不是图片名称,是图片集合的名称,所以关于image@2x,image@3x等,只需要写上前面的image,他们属于一个image下的图片集合,内部会根据屏幕分辨率自动识别,并进行展示。

第二种(2)不为图像提供缓存,以下filePath 和filePath2类似,区别在于后面跟上具体文件,但是这两种是根据文件路径去获取的,就是说你是@2x,就只能获取到@2x,没有的话就没办法获取;而filePath1是根据文件路径下相似的文件集来获取的,内部会自动识别@2x,@3x等

NSString *filePath = [[NSBundle mainBundle]pathForResource:@"hotBagImage" ofType:@"png"];
NSString *filePath2 = [[NSBundle mainBundle]pathForResource:@"hotBagImage" ofType:@"png" inDirectory:@"test.bundle"];
NSString *filePaht1 = [[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"test.bundle/hotBagImage.png"];

第三种(3)不为图像提供缓存,从二进制数据创建,利用NSData方式加载时,图像会被系统以数据方式加载到程序。当你不需要重用该图像,或者你需要将图像以数据方式存储到数据库,又或者你要通过网络下载一个很大的图像时,请尽量使用imageWithData的方式加载图像。

关于使用,重点说一下前两种

1 .  这里要说一下Assets.xcassets,属于管理图片的一个工程文件,内部可以创建图片集,icon集,启动图集等,能自动识别图片分辨率,使用的时候用imageNamed来获取图片,不能使用imageWithContentsOfFile。它是一个很好的图片管理文件,我们的一些小的icon或者图片可以放置进来,我们的启动图等在这里面管理还是比较方便,但是大量或者图片过大的话还是不建议使用。

2 .  bundle,资源管理文件。右键添加file中,iOS-Resource 中的setting bundle进行创建。我们可以在这里放置大量的工程素材,方便统一查找和管理。同样可以把不同分辨率的图片素材都加进来。我们就可以用

NSString *filePaht1 = [[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"test.bundle/hotBagImage.png"];

UIImage *image = [UIImage imageWithContentsOfFile:filePaht1];

这种方式去获取到图片集合,不占用系统内存,大大节省了内存,起到了性能优化,缺点如果资源素材多,会增加包的体积,但这种一般不可避免

3 .  就是创建文件进行素材资源管理,这种类似bundle,但是不优于,包内部解码有的是能获取到这些资源。

优缺点:

 1. Assets.xcassets,我们一般使用这个比较方便,资源文件不太大、不是很多的情况下并不会造成很大的性能问题。但是量大会增加系统内存,导致APP吃内存较多。

2.bundle ,这种适合大图片,量大的资源素材。我们使用imageWithContentsOfFile去加载图片,既能避免占用大量内存,同时bundle又起到对资源的封闭存储。缺点会增加包的体积,这点有时候对于我们并不是很大的影响

3.创建文件管理,这类直接把资源素材添加到一个开放文件中,可以使用imageWithContentsOfFile不占用内存,但容易丢失。

以上三种,第一种不能使用 imageWithContentsOfFile获取,他们都能使用imageNamed获取,对于这几种管理资源素材方式和加载方式可以根据不同情况进行选择。

开发中难免会需要注意一些细节,来做到项目优化,后续更新其他常用并需要注意的地方,如有不足请留言修正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值