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

大家都知道创建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获取,对于这几种管理资源素材方式和加载方式可以根据不同情况进行选择。

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

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

  1. Android Handler加载图片的几种方式(完)

    由于原文的结构有些不是很容易看清,先整理如下: 原文:http://www.eoeandroid.com/thread-210082-1-1.html 清单文件 <?xml version=&q ...

  2. iOS网络加载图片缓存策略之ASIDownloadCache缓存优化

    iOS网络加载图片缓存策略之ASIDownloadCache缓存优化 在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用户体 ...

  3. QML for Android 加载图片资源的几种方式

    前言 前段时间用 QML 做一个简单的 android 程序,需要打开 android手机本地图片,原本是一个非常简单的功能,但是碰到一些坑着实的被坑了一把,然而在网上并没有找到相关的文档,这里做个总 ...

  4. ajax加载vue数据,详解使用Vue.Js结合Jquery Ajax加载数据的两种方式

    整理文档,搜刮出一个使用vue.js结合jquery ajax加载数据的两种方式的代码,稍微整理精简一下做下分享. 废话不多说,直接上代码 html代码 demo {{message }} 测试jqu ...

  5. vue.js 动态加载 html,Vue加载组件、动态加载组件的几种方式

    什么是组件: 组件是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能.在有些情况下,组件也可以是原生HT ...

  6. Vue动态加载组件的四种方式

    动态加载组件的四种方式: 1.使用import导入组件,可以获取到组件 var name = 'system'; var myComponent =() => import('../compon ...

  7. Opencv判断是否加载图片的两种方法

    加载图片是图像处理最基本的操作,但有的时候我们加载图片会因为图片路径不正确 或者没有图片等原因而报错,经常写代码的凭经验就知道是哪错了,但初学者一般是看不懂这 些错误,就会很恼火了,如果加个判断语句就 ...

  8. 图片懒加载(lazyload)的几种方式

    背景 当页面中有很多图片时,全部加载需要很多时间,而且会消耗很多渲染资源,为了解决这个问题,加强用户体验,我们先将看得到的区域中的图片加载,也就是 可视化区域 加载,剩余部分等之后再加载. 原理   ...

  9. Android加载图片OOM错误解决方式

    前几天做项目的时候,甲方要求是PAD (SAMSUNG P600 10.1寸 2560*1600)的PAD上显示高分辨率的大图片. SQLITE採用BOLD方式存储图片,这个存取过程就不说了哈,网上一 ...

最新文章

  1. 简单明了!OLTP场景下的数据分布式设计原则
  2. LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)
  3. 关于selenium+java,实现部分截图功能,-针对单个元素的截图
  4. c++-内存管理-BC5
  5. 按钮开始多线程_微软MR技术专家分享:AR/VR多线程处理的八年经验与技巧
  6. html5 cs js字母验证码,JavaScript生成图形验证码
  7. maven3.6.3 配置环境变量_JDK1.8简单配置环境变量---两步曲
  8. pat乙级相当于什么水平_英语四六级/专四/专八相当于美国人什么水平?
  9. 什么是PV UV PR值
  10. Impala操作审计
  11. 利用SQL Server 2008 R2创建自动备份计划
  12. gcc的ar,nm,objdump,objcopy
  13. sklearn文本特征提取
  14. Optisystem软件与Matlab软件的联合数据读取
  15. 图解机器学习算法(10) | XGBoost模型最全解析(机器学习通关指南·完结)
  16. 北航2019计算机学院就业报告,就业丨北航2019届就业质量报告,本科就业率95%
  17. 打开office显示:你的office许可证有问题,你可能是盗版软件的受害者怎么办?
  18. 计算机网络典型的通信协议有,常用的通信网络协议有哪几种
  19. 判断字符串子序列【python】
  20. Redis存放短信验证码 RedisTemplate =>opsForValue

热门文章

  1. 买房应该全款还是贷款
  2. ZBrush笔刷属性栏简介
  3. HBuilder封装APP
  4. 什么样的视频号内容更容易火?视频号怎么做推送上热门
  5. 一点资讯app signature
  6. Launcher壁纸来源
  7. 一个简单的面试题 equals和==的区别
  8. java jdt_在JDT中使用Java 8 Lambda
  9. docker docker安装app
  10. 文化IP能量有多大,舞台就有多大