博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
imageNamed与imageWithContentsOfFile加载图片的区别
阅读量:6579 次
发布时间:2019-06-24

本文共 2256 字,大约阅读时间需要 7 分钟。

//读取本地图片  

#define LOADIMAGE(file,ext) [UIImage imageWithContentsOfFile:[[NSBundle mainBundle]pathForResource:file ofType:ext]]  
  
//定义UIImage对象  
#define IMAGE(A) [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:A ofType:nil]]  
  
//定义UIImage对象  
#define ImageNamed(_pointer) [UIImage imageNamed:_pointer] 
@不推荐第三个的原因:
+ (UIImage *)imageNamed:(NSString *)name方法
这个方法用一个指定的名字在系统缓存中查找并返回一个图片对象如果它存在的话。如果缓存中没有找到相应的图片,这个方法从指定的文档中加
载然后缓存并返回这个对象。因此的优点是当加载时会缓存图片。所以当图片会频繁的使用时,那么用的方法会比较好。但正是因此使用会缓存图片,即
将图片的数据放在内存中,iOS的内存非常珍贵并且在内存消耗过大时,会强制释放内存,即会遇到memory warnings。
为避免这种error,可以使用如下方法:
   imageWithContentsOfFile 仅加载图片,图像数据不会缓存。因此对于较大的图片以及使用情况较少时,那就可以用该方法,降低内存消耗。 
  NSString *path = [[NSBundle mainbundle] pathForResource:@" " ofType:@" "];
  UIImage *image = [UIImage imageWithContentsOfFile:path];
当然,对于图片处理等相关程序,可以直接为UIImage写一个catagory,重载imageNamed方法,如下:
@implementation UIImage(imageNamed_Hack) 
+(UIImage *)imageNamed:(NSString *)fileName
   // 方法一
   NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:“png”];  
   NSData *image = [NSData dataWithContentsOfFile:filePath];  
   UIImage *image = [UIImage imageWithData:image]; 
   return image;
   // 方法二(特别注意,ofType中填写的后缀名不需要加".")
   1.return [UIImage imageWithContentsOfFile:[[NSBundle mainBundle]pathForResource:fileName ofType:@"png"]];
   2.return [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] bundlePath], fileName ] ];
@end

1.用imageNamed函数

[UIImage imageNamed:ImageName];
2.用NSData的方式加载,例如:
NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];
NSData *image = [NSData dataWithContentsOfFile:filePath];
[UIImage imageWithData:image];
@由于第一种方式要写的代码比较少,可能比较多人利用imageNamed的方式加载图像。其实这两种加载方式都有各自的特点。
1)用imageNamed的方式加载时,系统会把图像Cache到内存。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存,而且释放图像的内存是一件相对来说比较麻烦的事情。例如:如果利用imageNamed的方式加载图像到一个动态数组NSMutableArray,然后将将数组赋予一个UIView的对象的animationImages进行逐帧动画,那么这将会很有可能造成内存泄露。并且释放图像所占据的内存也不会那么简单。但是利用imageNamed加载图像也有自己的优势。对于同一个图像系统只会把它Cache到内存一次,这对于图像的重复利用是非常有优势的。例如:你需要在一个TableView里重复加载同样一个图标,那么用imageNamed加载图像,系统会把那个图标Cache到内存,在Table里每次利用那个图像的时候,只会把图片指针指向同一块内存。这种情况使用imageNamed加载图像就会变得非常有效。
2)利用NSData方式加载时,图像会被系统以数据方式加载到程序。当你不需要重用该图像,或者你需要将图像以数据方式存储到数据库,又或者你要通过网络下载一个很大的图像时,请尽量使用imageWithData的方式加载图像。

转载地址:http://gtbno.baihongyu.com/

你可能感兴趣的文章
Kotlin 知识梳理(1) Kotlin 基础
查看>>
js正则表达式
查看>>
iOS socket通信,编解码,浮点型数据解析
查看>>
手把手教你如何新建scrapy爬虫框架的第一个项目(下)
查看>>
前端基础15:JS作用域基础
查看>>
Linux系统相关命令
查看>>
BATJ面试必会之 Spring 篇(一)
查看>>
表驱动法
查看>>
什么是企业内训
查看>>
firefox无法显示java插件plugin
查看>>
H3C设备之OSPF DR选举
查看>>
View控件Edittext属性
查看>>
List grantee right in oracle
查看>>
骨牌铺方格 ——解题报告
查看>>
Activity生命周期
查看>>
通过VBS编写自动输入账号和密码、自动登录程序的脚本
查看>>
MTK APSoC SDK MT7621编译固件的快速开始
查看>>
深度解析Istio系列之安全模块篇
查看>>
Linux 系统 审计
查看>>
JS -------------------设置弹出框位置屏幕的中间
查看>>