千家信息网

IOS如何实现图片存放

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要为大家展示了"IOS如何实现图片存放",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"IOS如何实现图片存放"这篇文章吧。Image.xcasse
千家信息网最后更新 2026年11月01日IOS如何实现图片存放

这篇文章主要为大家展示了"IOS如何实现图片存放",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"IOS如何实现图片存放"这篇文章吧。

Image.xcassets

创建 .xcassets,以 Image Set 形式管理图片,添加图片后会生成对应的 content.json 文件加入 @2x 和 @3x 等倍图后,打包后以 Assets.car 的形式存在,使用 [UIImage imageNamed:@"xxx"] 方式读取图片,可以使用图片缓存 -- 相当于创建了一个 key-value的字典,key 为图片名,value 为图片对象。创建图片对象后,该对象被加入到 NSCache 中(解码后的 Image Buffer),直到收到内存警告的时候,才会释放不在使用的图片对象。 因此,对于需要在多处显示的图片,其对应的 UIImage 对象只会被创建一次(不考虑内存警告时的回收),减少内存消耗。

图片直接加入工程中作为Resource

读取方式:创建图片 Resource 文件夹,直接将图片加入到工程中,使用如下方式读取图片

NSString *path = [NSBundle.mainBundle pathForResource:@"xxx" type:@"png"];UIImage *image = [UIImage imageWithContentsOfFile:path];

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

使用场景:由于这种方法的特性, 所以 Resource 的方法一般用在图片数据很大, 图片一般不需要多次使用的情况,比如说引导页背景(图片全屏)

优势:图片不会长期保存在内存当中, 所以不会有很多的内存浪费。同时, 大图一般不会长期使用, 而且大图占用内存一般比小图多了好多倍, 所以在减少大图的内存占用中, Resource 做的非常好

使用Bundle文件

Bundle 即资源文件包,将许多图片,XIB,文本文件组织在一起,打包成一个 Bundle 文件,方便在其他项目中引用包内的资源。Bundle 文件是静态的,不参与项目的编译,Bundle 包中不能包含可执行的文件,它仅仅是作为资源,被解析成为特定的二进制数据。优势:Bundle 中文件不参与项目编译,不影响App包的大小(可用于App的瘦身); 使用 bundle 方式方便对文件进行管理,方便在其他项目中引用包内的资源。使用场景:较大的图片,或者使用频率较低的图片读取方式:使用 imageWithContentsOfFile 进行读取,如下方法1;也可以对 UIImage 进行扩展,如下方法2

使用 imageWithContentsOfFile 读取

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

/// usage#import "BSKDefine.h"UIImageView * headerBgImgView = [[UIImageView alloc] init];headerBgImgView.image = [UIImage imageWithContentsOfFile:[SecKill_BUNDLE pathForResource:@"xxxx" ofType:@"png"]];

对 UIImage 进行扩展,创建 UIImage+BSKResources 类

/// UIImage+BSKResources.hNS_ASSUME_NONNULL_BEGIN@interface UIImage (BSKResources)+ (UIImage *)bskImageNamed:(NSString *)imageName InBundleName:(NSString *)bundleName;@endNS_ASSUME_NONNULL_END

/// UIImage+BSKResources.m#import "UIImage+BSKResources.h"@implementation UIImage (BSKResources)+ (UIImage *)bskImageNamed:(NSString *)imageName InBundleName:(NSString *)bundleName{ NSString *resourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:bundleName]; NSBundle *resourceBundle = [NSBundle bundleWithPath:resourcePath]; return [UIImage imageNamed:imageName inBundle:resourceBundle compatibleWithTraitCollection:nil];}@end

/// usage#import "UIImage+BSKResources.h"UIImageView * headerBgImgView = [[UIImageView alloc] init];headerBgImgView.image = [UIImage bskImageNamed:@"xxx" InBundleName:@"BSKResources.bundle"]];

Bundle 和 xcassets 区别

xcassets 里面的图片,只能通过 imageNamed 加载。Bundle 还可以通过 imageWithContentsOfFile 等方式加载xcassets 里的 2x 和 3x,会根据具体设备分发,不会同时包含(App Slicing),而 Bundle 会都包含xcassets 内,可以对图片进行 Slicing,即裁剪和拉伸,Bundle 不支持Bundle 内支持多语言,xcassets 不支持此外,使用 imageNamed 创建的 UIImage,会立即被加入到 NSCache 中(解码后的 Image Buffer),直到收到内存警告的时候,才会释放不在使用的 UIImage;而使用 imageWithContentsOfFile 创建的对象,每次都会重新申请内存,相同图片不会缓存。因此,建议常用的、较小的图,放在 xcassets 内管理,而大图、使用频率较低的图,应该放在 Bundle 内管理

以上是"IOS如何实现图片存放"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

图片 文件 内存 方式 对象 管理 数据 方法 资源 项目 大图 内容 时候 篇文章 支持 优势 同时 场景 工程 形式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 华服互联网科技靠谱吗 广州淘业互联网络科技 西安纸贵互联网科技有限公司 科技互联网企业 新华互联网科技学校 杭州互联网科技公司 互联网科技媒体 无线互联网科技 互联网巨头投资的硬核科技 北京大学互联网科技怎么样 恒银科技与互联网金融 栖莱科技互联网股份有限公司 成都铂石互联网科技做什么的 洛阳昕诺飞互联网科技有限公司 内蒙古九一互联网科技 雨阳互联网卡科技有限公司 工业互联网科技成果转化 西安左小互联网科技有限公司 亚光科技低轨卫星互联网 北京瑞云互联网科技有限公司 天津市摩尔互联网科技 广州大一互联网络科技有限公司 科技互联网公司装修 顺网科技2021年互联网排名 晓花互联网科技有限公司网址 洛阳昕诺飞互联网科技有限公司 互联网科技扶贫时间 山东有哪些互联网科技公司 广东工业互联网大赛深圳学泰科技 互联网科技手抄报图片
0