美文网首页
加载本地图片的几种方式和区别

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

作者: MrDarren | 来源:发表于2017-05-10 22:09 被阅读0次

    加载本地图片在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的图片

    相关文章

      网友评论

          本文标题:加载本地图片的几种方式和区别

          本文链接:https://www.haomeiwen.com/subject/xeqntxtx.html