ios 图片资源管理的四种方式(Assets,bundle文件,Resource,沙盒文件目录下) - Go语言中文社区

ios 图片资源管理的四种方式(Assets,bundle文件,Resource,沙盒文件目录下)


图片资源管理

1. Assets.xcassets

一般是以蓝色的Assets.xcassets的文件夹形式在工程中,以Image Set的形式管理。当一组图片放入的时候同时会生成描述文件Contents.json。且在打包后以Assets.car的形式存在,不能打开(网上有工具ThemeEngine可以打开,感兴趣的可以测试)。
以此方式放入的图片并不在mainBundle中
在这里插入图片描述

iOS 开发中一般在工程内导入两个到三个同内容不同像素的图片文件, 一般如下:

image.png (30 x 30)

image@2x.png (60 x 60)

image@3x.png (90 x 90)

这三张图片都是相同内容, 而且图片名称的前缀相同, 区别在与图片名以及图片的分辨率. 开发者将这三张图片拉入 ImageAssets 后, Xcode 会以图片前缀创建一个图片组(这里也就是 “image”). 然后在代码中写:

使用
UIImage *image = [UIImage imageNamed:@"image"];

1.特性: ImageAssets 也是从图片文件中读取图片数据转为 UIImage, 只不过这些图片数据都打包在 ImageAssets 中. 还有一个最大的区别就是图片缓存. 相当于有一个字典, key 是图片名, value是图片对象. 调用imageNamed:方法时候先从这个字典里取, 如果取到就直接返回, 如果取不到再去文件中创建, 然后保存到这个字典后再返回. 由于字典的key和value都是强引用, 所以一旦创建后的图片永不销毁.

> 

2. 优势: 性能好,节省Disk。Asset Catalogs会用一个高度优化的特殊格式来存所有图片,而不是一个一个的单独的图片资源,会更少的涉及频繁Disk I/O操作,且会按需下载适合你机型的合适分辨率的图片资源; 安全性。图片资源得到一定程度保护(Asset,car不易打开)

当一个 icon 在多个地方需要被显示的时候, 其对应的UIImage对象只会被创建一次, 而且多个地方的 icon 都将会共用一个 UIImage 对象. 减少沙盒的读取操作.

> 

 1. ImageAssets 的使用场景
ImageAssets 最主要的使用场景就是 icon 类的图片, 一般 icon 类的图片大小在 3kb 到 20 kb 不等, 都是一些小文件.

> 

2. 直接拖拽到工程

如果是纯代码,图片名需要手动添加@2x,@3x等倍数标识,且需要指明后缀.png,.jpg;IB添加图片的话只需要指明后缀就好,不用添加倍数标识。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190308170211780.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1oxNTkxMDkw,size_16,color_FFFFFF,t_70)
1.Resource 的使用方式
将文件直接拖入到工程目录下, 并告诉Xcode打包项目时候把这些图片文件打包进去. 这样在应用的".app"文件夹中就有这些图片. 在项目中, 读取这些图片可以通过以下方式来获取图片文件并封装成UIImge对象:
NSString *path = [NSBundle.mainBundle pathForResource:@"image@2x" type:@"png"];

UIImage *image = [UIImage imageWithContentsOfFile:path];

>

2. Resource 的特性
在 Resource 的图片管理方式中, 所有的图片创建都是通过读取文件数据得到的, 读取一次文件数据就会产生一次NSData以及产生一个UIImage, 当图片创建好后销毁对应的NSData, 当UIImage的引用计数器变为0的时候自动销毁UIImage. 这样的话就可以保证图片不会长期地存在在内存中.

> 

3. Resource 的常用情景
由于这种方法的特性, 所以 Resource 的方法一般用在图片数据很大, 图片一般不需要多次使用的情况. 比如说引导页背景(图片全屏, 有时候运行APP会显示, 有时候根本就用不到).

> 

4. Resource 的优点

图片的生命周期可以得到管理无疑是 Resource 最大的优点, 当我们需要图片的时候就创建一个, 当我们不需要这个图片的时候就让他销毁. 图片不会长期的保存在内存当中, 所以不会有很多的内存浪费. 同时, 大图一般不会长期使用, 而且大图占用内存一般比小图多了好多倍, 所以在减少大图的内存占用中, Resource 做的非常好.

> 

关于imageNamed与imageWithContentsOfFile详解

3. 把图片资源打包成bundle文件(资源猫)

在这里插入图片描述

1.Bundle 文件,简单理解,就是资源文件包。我们将许多图片、XIB、文本文件组织在一      起,打包成一个 Bundle 文件。方便在其他项目中引用包内的资源。

> 

2.Bundle 文件是静态的,也就是说,我们包含到包中的资源文件作为一个资源包是不参       加项目编译的。bundle 包中不能包含可执行的文件。它仅仅是作为资         源,被解析成为特定的二进制数据。

> 

3.优势:
1.为了方便管理资源文件,可以使用bundle的方式来进行管理
2.使用频率低的可以建立一个bundle存放图片,使用imageWithContentsOfFile加载.

> 

4.使用
// bundle path
#define STBundle_Name @"SafeToolResource.bundle"
#define STBundle_Path [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:STBundle_Name]
#define STBundle [NSBundle bundleWithPath:STBundle_Path]


+ (UIImage *)getSafeToolSMSBackgroundImage
{
    NSString *imageName = @"cmbcSafeTool_sms.png";
    if ([UIDevice is4Point7inchScreenOr5Point8inchScreen_cmbc]) {
        
        imageName = @"cmbcSafeTool_sms_4.7.png";
    }
    
//    return [UIImage imageNamed:imageName];
    return [UIImage imageNamed:imageName
                      inBundle:STBundle
 compatibleWithTraitCollection:nil];
}

bundle 文件制作详解请看

4. 沙盒文件目录下

沙盒文件下的图片初次一般是使用预处理复制的,之后图片可以从服务器那来进行更新沙盒图片的文件。

  1. 预处理把图片复制
    把需要预处理的图片,打包放在zip文件里面,把zip文件放入工程,把图片存在沙盒里面
  2. 查找图片
    现从沙盒文件查找->再从bundl查找->最后从主bundle查找。

图片资源管理demo

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Z1591090/article/details/88355955
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-11-27 22:29:09
  • 阅读 ( 2272 )
  • 分类:研发管理

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢