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

一、加载mainBundle的图片

1、imageNamed

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

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

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

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

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

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

iOS 图片如何本地化保存 iapp本地图片_加载


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


iOS 图片如何本地化保存 iapp本地图片_bundle_02


二、加载custom Bundle的图片

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

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

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

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

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


iOS 图片如何本地化保存 iapp本地图片_加载_03





iOS 图片如何本地化保存 iapp本地图片_加载_04




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


iOS 图片如何本地化保存 iapp本地图片_加载_05


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

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

按下图操作

iOS 图片如何本地化保存 iapp本地图片_bundle_06





iOS 图片如何本地化保存 iapp本地图片_缓存_07





iOS 图片如何本地化保存 iapp本地图片_加载_08





iOS 图片如何本地化保存 iapp本地图片_bundle_09




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


iOS 图片如何本地化保存 iapp本地图片_缓存_10




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


iOS 图片如何本地化保存 iapp本地图片_加载_11





iOS 图片如何本地化保存 iapp本地图片_缓存_12





iOS 图片如何本地化保存 iapp本地图片_bundle_13





iOS 图片如何本地化保存 iapp本地图片_bundle_14




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


iOS 图片如何本地化保存 iapp本地图片_iOS 图片如何本地化保存_15




3、custom framework中加载custom framework里的图片


有以下几种方法


iOS 图片如何本地化保存 iapp本地图片_加载_16





iOS 图片如何本地化保存 iapp本地图片_加载_17




总结:

1、imageNamed加载图片时会在内存中缓存图片,适用于

1)、主工程中加载mainBundle的图片

2)、主工程中加载Assets.xcassets的图片

3)、custom Framework中加载custom Framework的图片 

2、imageWithContentsOfFile加载图片时不会在内存中缓存图片,一般跟 [bundle pathForResource: ofType:]一起使用,适用于

1)、主工程中加载mainBundle的图片

2)、主工程中加载custom Framework的图片

3)、 custom Framework中加载custom Framework的图片