IOS 图片存放3种方式的实现
Image.xcassets
- 创建.xcassets,以ImageSet形式管理图片,添加图片后会生成对应的content.json文件
- 加入@2x和@3x等倍图后,打包后以Assets.car的形式存在,
- 使用[UIImageimageNamed:@"xxx"]方式读取图片,可以使用图片缓存——相当于创建了一个key-value的字典,key为图片名,value为图片对象。创建图片对象后,该对象被加入到NSCache中(解码后的ImageBuffer),直到收到内存警告的时候,才会释放不在使用的图片对象。因此,对于需要在多处显示的图片,其对应的UIImage对象只会被创建一次(不考虑内存警告时的回收),减少内存消耗。
图片直接加入工程中作为Resource
读取方式:创建图片Resource文件夹,直接将图片加入到工程中,使用如下方式读取图片
NSString*path=[NSBundle.mainBundlepathForResource:@"xxx"type:@"png"]; UIImage*image=[UIImageimageWithContentsOfFile: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 //bundlepath #defineSTBundle_Name@"SafeToolResource.bundle" #defineSTBundle_Path[[[NSBundlemainBundle]resourcePath]stringByAppendingPathComponent:STBundle_Name] #defineSTBundle[NSBundlebundleWithPath:STBundle_Path]
///usage #import"BSKDefine.h" UIImageView*headerBgImgView=[[UIImageViewalloc]init]; headerBgImgView.image=[UIImageimageWithContentsOfFile:[SecKill_BUNDLEpathForResource:@"xxxx"ofType:@"png"]];
对UIImage进行扩展,创建UIImage+BSKResources类
///UIImage+BSKResources.h NS_ASSUME_NONNULL_BEGIN @interfaceUIImage(BSKResources) +(UIImage*)bskImageNamed:(NSString*)imageNameInBundleName:(NSString*)bundleName; @end NS_ASSUME_NONNULL_END
///UIImage+BSKResources.m #import"UIImage+BSKResources.h" @implementationUIImage(BSKResources) +(UIImage*)bskImageNamed:(NSString*)imageNameInBundleName:(NSString*)bundleName { NSString*resourcePath=[[[NSBundlemainBundle]resourcePath]stringByAppendingPathComponent:bundleName]; NSBundle*resourceBundle=[NSBundlebundleWithPath:resourcePath]; return[UIImageimageNamed:imageNameinBundle:resourceBundlecompatibleWithTraitCollection:nil]; } @end
///usage #import"UIImage+BSKResources.h" UIImageView*headerBgImgView=[[UIImageViewalloc]init]; headerBgImgView.image=[UIImagebskImageNamed:@"xxx"InBundleName:@"BSKResources.bundle"]];
Bundle和xcassets区别
- xcassets里面的图片,只能通过imageNamed加载。Bundle还可以通过imageWithContentsOfFile等方式加载
- xcassets里的2x和3x,会根据具体设备分发,不会同时包含(AppSlicing),而Bundle会都包含
- xcassets内,可以对图片进行Slicing,即裁剪和拉伸,Bundle不支持
- Bundle内支持多语言,xcassets不支持
- 此外,使用imageNamed创建的UIImage,会立即被加入到NSCache中(解码后的ImageBuffer),直到收到内存警告的时候,才会释放不在使用的UIImage;而使用imageWithContentsOfFile创建的对象,每次都会重新申请内存,相同图片不会缓存。因此,建议常用的、较小的图,放在xcassets内管理,而大图、使用频率较低的图,应该放在Bundle内管理
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。