在 Apple 官方帮助文档提供了两个加载图片的方法数据库
imageNamed , 其参数为图片的名字缓存
imageWithContentsOfFile , 其参数是图片文件的路径网络
下面主要是说一下他们的区别:spa
imageNamed:
指针
用这个方法加载图片分为两种状况:code
系统缓存有这个图片orm
直接从缓存中取得对象
系统缓存没有这个图片图片
经过传入的文件名对整个工程进行遍历 , 若是若是找到对应的图片 , iOS 系统首先要作的是将这个图片放到系统缓存中去,以备下次使用的时候直接从系统缓存中取 , 接下来重复第一步.内存
那么试想一下 , 若是要加载的这个图片的文件量不少,文件大小很大,内存不足,内存泄露,甚至是程序的崩溃都是很容易发生的事.
[UIImage imageNamed:ImageName];
imageWithContentsOfFile 和 initWithContentsOfFile
用这个方法只有一种状况,那就是仅仅加载图片 , 图像数据不会被缓存 . 所以在加载较大图片的时候 , 以及图片使用状况不多的时候能够使用这两个方法 , 下降内存消耗.
NSString *imageFile = [NSString stringWithFormat:@"%@/%@.jpg", [[NSBundle mainBundle] resourcePath], fileName]; UIImage* image = [UIImage imageWithContentsOfFile:imageFile];
若是想把上述代码简写为一行能够在 pch 文件中定义一个宏,在整个项目中使用
#define ResourcePath(path) [[NSBundle mainBundle] pathForResource:path ofType:nil] #define ImageWithPath(path) [UIImage imageWithContentsOfFile:path]
这样就能够一行代码搞定
UIImage* image = ImageWithPath(ResourcePath(@"img.jpg"));
总结:
根据各自的优缺点来选择性的使用相应的方法.
当图片文件较小 , 使用比较频繁的时候那么使用 imageNamed 比较好.例如:UITableViewCell , UICollectionCell 等加载同一个图标的时候 , 在Table里每次利用那个图像的时候,只会把图片指针指向同一块内存。能够直接从缓存中取的数据而不用遍历整个工程.在这种状况下 imageNamed 的效率仍是很是高的.同一个图片对象系统只会把它 Cache 到内存一次 , 这对图像的重复利用是很是有优点的.
你用第二种方式加载的时候 , 图像会被系统以数据的形式加载到程序 . 当你不须要重用该图像,或者你须要将图像以数据方式存储到数据库,又或者你要经过网络下载一个很大的图像时,请尽可能使用imageWithData的方式加载图像。
著做权声明:本文为做者原创,欢迎转载分享。请尊重做者劳动,转载时保留该声明和做者博客连接,谢谢!