imageNamed与imageWithContentsOfFile加载图片的区别

简介: <p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px; font-family:Arial; font-size:14px; line-height:26px; border:0px"> <span style="font-family:'Comic Sans MS'; font-

//读取本地图片  
#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的方式加载图像。

目录
相关文章
|
Web App开发 存储 缓存
你真的知道Cookie?SameSite,Secure,Httponly
这两天(已经是一个多月前了) SF 上面很多 cookie 的问题,然后还有个 cookie 相关的付费问答。 所以咱们今天来这么一节,废话多说点,先说说大体问题方向。 跨域如何携带 cookie chrome 80 版本加强隐私。SameSite=Lax 为默认值,禁止了一部分场景携带 cookie。
917 0
你真的知道Cookie?SameSite,Secure,Httponly
|
Linux 数据安全/隐私保护 iOS开发
|
1天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
11天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
5天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
449 192
|
3天前
|
数据采集 消息中间件 人工智能
跨系统数据搬运的全方位解析,包括定义、痛点、技术、方法及智能体解决方案
跨系统数据搬运打通企业数据孤岛,实现CRM、ERP等系统高效互通。伴随数字化转型,全球市场规模超150亿美元,中国年增速达30%。本文详解其定义、痛点、技术原理、主流方法及智能体新范式,结合实在Agent等案例,揭示从数据割裂到智能流通的实践路径,助力企业降本增效,释放数据价值。

热门文章

最新文章