加载本地图片的几种方式和区别
加载本地图片在iOS开发中是非常常见的,一般来说,加载本地图片主要有以下两种方法,分为两大类。
一、加载mainBundle的图片
1、imageNamed
这个方法用一个指定的名字在系统缓存中查找一个图片对象,如果存在就返回一个图片对象。如果缓存中没有找到相应的图片,就从指定的文档中加载然后缓存并返回这个对象。
因此imageNamed的优点是当加载时会缓存图片。所以当图片会频繁的使用时,那么用imageNamed的方法会比较好。
例如需要在一个TableView里的TableViewCell里都加载同样一个图标,那么用imageNamed加载图像效率很高。系统会把那个图标Cache到内存,在TableViewCell里每次利用那个图像的时候,只会把图片指针指向同一块内存。
正是因此使用imageNamed会缓存图片,即将图片的数据放在内存中,iOS的内存非常珍贵并且在内存消耗过大时,会强制释放内存,即会遇到memory warnings。而在iOS系统里面释放图像的内存是一件比较麻烦的事情,有可能会造成内存泄漏。
例如当一个UIView对象的animationImages是一个装有UIImage对象动态数组NSMutableArray,并进行逐帧动画。当使用imageNamed的方式加载图像到一个动态数组NSMutableArray,这将会很有可能造成内存泄露。
另外,如果加载的是png格式的图片,则可以省略.png后缀。
2 、imageWithContentsOfFile
这个方法仅加载图片,图像数据不会缓存。
因此对于较大的图片以及使用情况较少时,那就可以用该方法,降低内存消耗。
一般是结合[[NSBundle mainBundle] pathForResource: ofType:];这个方法一起使用。
但是使用[[NSBundle mainBundle] pathForResource: ofType:]这个方法的时候需要注意一点: Assets.xcassets里面的图片,不管是jpg还是png都不能用[[NSBundle mainBundle] pathForResource: ofType:]获取,只能用[UIImage imageNamed:]获取。
而在工程目录下的图片,既可以用[[NSBundle mainBundle] pathForResource: ofType:]获取,也能用[UIImage imageNamed:]获取。
二、加载customBundle的图片
这里得分两种情况,一种是真实的bundle(创建的后缀为.bundle的文件),另一种是framework(创建的后缀为.framework的文件)
ps:其实framework也是一种bundle,所以一开始我也是按照从custom bundle里获取图片的方面从framework获取图片,但是却发现一直获取不到,最后才发现,两者是有一些区别的,具体区别请看下面分析
1、主工程中加载custombundle里的图片
在这之前,顺便简单说下自custom bundle的创建
在工程里command + n,再按图示操作
往Resources.bundle添加加图片,直接将图片拖拽到目录下,然后按下图方式加载图片
2、主工程中加载customframework里的图片
在这之前,顺便简单说下自custom framework的创建
按下图操作
注意,创建好framework后,如果想访问里面的资源,需要先将framework加载起来,按下图操作
另外,如果想访问framework里其他资源,比如里面的UIViewController,需执行下面操作
接下来就是加载customFramework里面的图片,有以下两种方式
3、customframework中加载customframework里的图片
有以下几种方法
总结:
1、imageNamed加载图片时会在内存中缓存图片,适用于
1)、主工程中加载mainBundle的图片
2)、主工程中加载Assets.xcassets的图片
3)、custom Framework中加载custom Framework的图片
2、imageWithContentsOfFile加载图片时不会在内存中缓存图片,一般跟[bundlepathForResource:ofType:]一起使用,适用于
1)、主工程中加载mainBundle的图片
2)、主工程中加载custom Framework的图片
3)、 custom Framework中加载custom Framework的图片
上一篇下一篇