天天看点

imageNamed与imageWithContentsOfFile加载图片的区别

//读取本地图片  

#define loadimage(file,ext) [uiimage imagewithcontentsoffile:[[nsbundle mainbundle]pathforresource:file oftype:ext]]  

//定义uiimage对象  

#define image(a) [uiimage imagewithcontentsoffile:[[nsbundle mainbundle] pathforresource:a oftype:nil]]  

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