资源管理包含:文本文件,FrameWork ,Bundle,Resource...
而Images.scassets 是我们经常使用的资源管理文件,它是Xcode 5之后的一个图片资源管理文件;之前我们App 的iCON,LaunchImage等需要配置不同的Size 和 名称系统才能找到对应关系的资源;
主要来谈下对于我们加载资源两种方式:
- Resource (直接拖进项目,可以在.ipa下看到的资源)
- Images.scassets
图片格式
对于iOS本地应用程序来说使用PNG,重要事情说三遍: 为什么 为什么 为什么
官方表示当iOS应用构建的时候,Xcode会通过一种方式优化.png文件而不会优化其它文件格式。具体优化了什么呢 ?
iPhone的vRAM在存放单个像素的颜色的时候,并不是按照传统的“红-绿-蓝”这样的顺序排列的,而是“蓝-绿-红”,即我们常说的RGB,在iPhone的显存里是BGR,无Alpha通道;
Xcode在编译时,会对png资源进行优化,把png里RGB转成BGR,所有的alpha通道先和RGB三通道先乘好(比如R:1 G:1 B:1 A:0.5的颜色直接转成 R:0.5 G:0.5 B:0.5)最后进行渲染;
PNG
- 1.同个分辨率的图片,保存为png要比jpg大;
- 2.png图片有alpha通道,因此它支持图片透明,而jpg不支持透明;
- 3.xcode会对png格式进行特殊的优化处理,而对于其他图片不做处理
JPG
- 1: 高压缩率
- 2: 适合扫描使用
存储及注意事项
Images.xcassets 文件打包后会压缩在Assets.car文件下,一般通过 imageName 的方式加载,会缓存资源文件;
可以通过 Slicing 设置拉伸效果(聊天气泡,不同长度多语言文案资源扩展)
Resource 放在项目里的下载ipa解压缩就可以直接获取, mainBundle 查找项目目录下文件;
众所周知的缓存加载问题: imageNamed 和 imageWithContentsOfFile ;
在.car中的图片是不能通过imageWithContentsOfFile:来加载;
imageName:加载的图片要么是Assets.car中的图片,要么是资源包(mainBundle)中直接存放的图片。
如果用imageNamed:从Images.xcassets以外的地方加载图片,必须在文件名后加扩展名;
自定义 bundle 问题 (独立模块和公共组件类 资源整合)
NSBundle *adSupportBundle = [NSBundlebundleWithPath:@"/Your BundlePath"];
[adSupportBundle load];
内存问题
Q: 通过[UIImage imageNamed:]生成的对象什么时候被释放 ?
A: 加载文件名称,首次展示时候会进行文件读取和解码,同时保存一份全局缓存,内部实现相当于字典(key:value),App 第一次退到后台和收到内存警告时,该图片的缓存才会被清空,其他情况下缓存会一直存在。
而 Resource方式 (指直接拖进项目中在 .ipa根目录下或者沙盒中),图片创建通过读取文件数据加载,产生NSData 和 UIImage,之后销毁Data,UIImage引用计数为 0 后,也同样销毁;(类 imageWithContentsOfFile 不缓存逻辑,不频繁使用的大图资源加载方式)
缩包优化
<1> 资源文件过大, 根本问题减少资源的使用,能用代码方案实现则替换; 当然前提也是满足产品设计的要求;(如:圆角,阴影,灰度处理等)
<2> 对于资源文件进行压缩处理,工具有很多,压缩比例客观; (imageOptim *非广告*)
资源缩包问题有想法和实践的同学,欢迎留言沟通交流~~~