加载本地图片的几种方式和区别

加载本地图片在iOS开发中是非常常见的,一般来说,加载本地图片主要有以下两种方法,分为两大类。

一、加载mainBundle的图片

1、imageNamed

这个方法用一个指定的名字在系统缓存中查找一个图片对象,如果存在就返回一个图片对象。如果缓存中没有找到相应的图片,就从指定的文档中加载然后缓存并返回这个对象。

因此imageNamed的优点是当加载时会缓存图片。所以当图片会频繁的使用时,那么用imageNamed的方法会比较好。

例如需要在一个TableView里的TableViewCell里都加载同样一个图标,那么用imageNamed加载图像效率很高。系统会把那个图标Cache到内存,在TableViewCell里每次利用那个图像的时候,只会把图片指针指向同一块内存。

正是因此使用imageNamed会缓存图片,即将图片的数据放在内存中,iOS的内存非常珍贵并且在内存消耗过大时,会强制释放内存,即会遇到memory warnings。而在iOS系统里面释放图像的内存是一件比较麻烦的事情,有可能会造成内存泄漏。

例如当一个UIView对象的animationImages是一个装有UIImage对象动态数组NSMutableArray,并进行逐帧动画。当使用imageNamed的方式加载图像到一个动态数组NSMutableArray,这将会很有可能造成内存泄露。

另外,如果加载的是png格式的图片,则可以省略.png后缀。

加载本地图片的几种方式和区别_第1张图片

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:]获取。

加载本地图片的几种方式和区别_第2张图片

二、加载customBundle的图片

这里得分两种情况,一种是真实的bundle(创建的后缀为.bundle的文件),另一种是framework(创建的后缀为.framework的文件)

ps:其实framework也是一种bundle,所以一开始我也是按照从custom bundle里获取图片的方面从framework获取图片,但是却发现一直获取不到,最后才发现,两者是有一些区别的,具体区别请看下面分析

1、主工程中加载custombundle里的图片

在这之前,顺便简单说下自custom bundle的创建

在工程里command + n,再按图示操作

加载本地图片的几种方式和区别_第3张图片
加载本地图片的几种方式和区别_第4张图片

往Resources.bundle添加加图片,直接将图片拖拽到目录下,然后按下图方式加载图片

加载本地图片的几种方式和区别_第5张图片

2、主工程中加载customframework里的图片

在这之前,顺便简单说下自custom framework的创建

按下图操作

加载本地图片的几种方式和区别_第6张图片
加载本地图片的几种方式和区别_第7张图片
加载本地图片的几种方式和区别_第8张图片
加载本地图片的几种方式和区别_第9张图片

注意,创建好framework后,如果想访问里面的资源,需要先将framework加载起来,按下图操作

加载本地图片的几种方式和区别_第10张图片

另外,如果想访问framework里其他资源,比如里面的UIViewController,需执行下面操作

加载本地图片的几种方式和区别_第11张图片
加载本地图片的几种方式和区别_第12张图片
加载本地图片的几种方式和区别_第13张图片
加载本地图片的几种方式和区别_第14张图片

接下来就是加载customFramework里面的图片,有以下两种方式

加载本地图片的几种方式和区别_第15张图片

3、customframework中加载customframework里的图片

有以下几种方法

加载本地图片的几种方式和区别_第16张图片
加载本地图片的几种方式和区别_第17张图片

总结:

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的图片

你可能感兴趣的:(加载本地图片的几种方式和区别)