前言
在上家公司离职的时候,新伙计来接手我的工作,在给他讲项目的时候,发现我项目中的图片资源都是放在单独的文件夹里面的,然后他就问了我一个问题:为什么你的图片资源不放在Images.xcassets里?
问题来了,为什么一定要放在Images.xcassets里面?而不能放在单独的文件夹里面?放在Images.xcassets里面和放在单独的文件夹里面有什么区别?
查了资料后,可知:
放在Images.xcassets里面的图片:
- 只支持png格式的图片
- 图片只支持[UIImage imageNamed:]的方式实例化,但是不能从Bundle中加载。(使用[NSBundle MainBundle] pathForResources 拿不到 images.xcassets里面图片的路径)
- Images.xcassets中的所有文件会被打包为Assets.car的文件,并且图片会被压缩,从而使包的体积变小
放在单独文件夹的图片:
- 可以使用[UIImage imageNamed:]加载,也可以使用imageWithContentOfFile:方法加载
这又出现一个问题,[UIImage imageNamed:]加载图片,与imageWithContentOfFile:加载图片有什么区别?
使用imageName:加载图片
- 加载到内存当中会一直存在内存当中,(图片)不会随着对象的销毁而销毁。
- 加载进去图片后,占用的内存归系统管理,我们是无法管理的。
- 相同的图片是不会重复加载的
- 加载到内存中占据的内存较大
使用imageWithContentOfFile:加载图片
- 加载到内存中占据的内存较小
- 相同的图片会被重复加载到内存当中
- 加载的图片会随着对象的销毁而销毁
总结:
放在Images.xcassets里面的图片可以被压缩.car文件,减小app包的体积
但是不能使用路径来加载图片,只能使用[UIIimage imageName:]加载图片
而imageName:这个方法加载图片,会在内存中一直存在,什么时候销毁不受管理员控制,因此适用于加载频繁的小图片
而放在文件夹的图片,可以使用imageWithContentOfFile:方法加载,该方法的好处是内存随着对象的销毁而销毁,因此适用于大图片、频率低的图片
小图片 或者 使用频率比较高的图片,可以直接放在Images.xcassets或者单独文件夹,使用[UIIimage imageName:]方法加载图片
大图片、使用频率低的图片可以放在单独文件夹,使用imageWithContentOfFile:方法加载
其实,大多数情况下,都是直接使用[UIImage imageNamed:]这种加载本地图片,既然是使用这种方法,那么图片放在Images.xcassets里面和放在单独文件夹里面区别不是很大,最大的区别就是Images.xcassets在打包的时候会减小包的体积。
参考
http://www.voidcn.com/article/p-awgvdtyd-bqn.html
https://cloud.tencent.com/developer/article/1337990
https://cloud.tencent.com/developer/article/1337991?from=article.detail.1337990