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的方式加载图像。

目录
相关文章
|
5月前
|
缓存 监控 Java
在使用 Glide 加载 Gif 动画时避免内存泄漏的方法
【10月更文挑战第20天】在使用 Glide 加载 Gif 动画时,避免内存泄漏是非常重要的。通过及时取消加载请求、正确处理生命周期、使用弱引用、清理缓存和避免重复加载等方法,可以有效地避免内存泄漏问题。同时,定期进行监控和检测,确保应用的性能和稳定性。需要在实际开发中不断积累经验,根据具体情况灵活运用这些方法,以保障应用的良好运行。
|
前端开发 算法
一个有趣的图片加载效果
一个有趣的图片加载效果
124 0
|
JavaScript UED
Day24 - 图片懒加载的原理
Day24 - 图片懒加载的原理
145 0
|
缓存
Picasso图片框架加载图片 使用及缓存问题
Picasso图片框架加载图片 使用及缓存问题
|
XML 数据格式
图片加载错乱,Glide无法设置Tag解决方式
图片加载错乱,Glide无法设置Tag解决方式
379 0
|
JavaScript UED 缓存
图片预加载和懒加载的实现方法
图片预加载,即图片提前加载,可以保证图片快速、无缝的发布,用户需要查看时可直接从本地缓存中渲染,适用于图片占据很大比例的网站。 一、懒加载 将图片src赋值为一张默认的图片,当用户滚动到可视区域的时候,再去加载真正的图片; 代码实现: html代码 js代码 vue中实现懒加载 对于图片过多的页面,为了加速页面加载速度,所以很多时候我们需要将页面内未出现在可视区域内的图片先不做加载, 等到滚动到可视区域后再去加载。
2205 0
|
移动开发 JavaScript 前端开发
|
存储 缓存 Java
浅谈 Glide - BitmapPool 的存储时机 & 解答 ViewTarget 在同一View显示不同的图片时,总用同一个 Bitmap 引用的原因
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguanh/ GitHub : https://github.com/af913337456/ 腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities 这两天在改造我的私人APP 非ROOT版微信自动回复, 使之可以多开的时候,碰到一个这样的问题。
1556 0