加载图片的几种方式
方法一:
UIImage * image = [UIImage imageNamed:@"test.png"];
这个方法创建的图片是从缓存里面获取的,先在缓存里查看,看是不是有这个图片,没有的话将图片添加到缓存再使用。有的话直接使用缓存里面的。在程序中,如果这个图片要在多个地方使用的话,建议使用这个方法。缺点是:一旦加入到缓存中就一直占用内存,不能被释放掉。
方法二:
//读取本地图片路径
NSString *imagePath = [NSString stringWithFormat:@"%@"/Documents/%@.jpg",NSHomeDirectory(),@"test"];
[UIImage imageWithContentsOfFile:imagePath];
从手机本地读取,比较第一种方式,这个是直接加载图片的,图片不需要的时候,可以release掉。所以建议在使用重复率低的地方使用这种方法。
方法三:
//下面的这种方式会出现卡线程的情况,所以建议在子线程中操作
//imageWithData:data
NSURL *url = [NSURL URLWithString:@"http://pgdt.gtimg.cn/gdt/0/DByX1dCAUAALQABeBYfyKuDPe9q0mK.jpg/0?ck=c6edb674518c3a50648ed1b568d626d2"];
UIImage *image2 = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
需要注意的是,如果imageWithData:是同步网络请求,如果在主线程直接使用的话,会卡主线程,因此一般不会再主线程中直接使用,而是采用异步网络请求获得data的值。
需要设置图片 UIImage
第一种:
[imageView setImage:[UIImage imageNamed:@"1.jpg"]];
第二种:
NSString *filePath = [NSBundle mainBundle]pathForResource:@"1" ofType:@"jpg"];
UIImage *images = [UIImage imageWithContentsOfFile:filePath];
[imageView setImage:images];
第三种:
NSData *data = [NSData dataWithContentsOfFile:filePath];
UIImage *image2 = [UIImage imageWithData:data];
[imageView setImage:image2];
其中第一、第二属于一种,共两种:
1、用imageNamed的方式加载时,系统会把图像Cache到内存。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存,而且释放图像的内存是一件相对来说比较麻烦的事情。例如:如果利用imageNamed的方式加载图像到一个动态数组NSMutableArray,然后将数组赋予一个UIView的对象的animationImages进行逐帧动画,那么这将会很有可能造成内存泄露。并且释放图像所占据的内存也不会那么简单。但是利用imageNamed加载图像也有自己的优势。对于同一个图像系统只会把它Cache到内存一次,这对于图像的重复利用是非常有优势的。例如:你需要在一个TableView里重复加载同样一个图标,那么用imageNamed加载图像,系统会把那个图标Cache到内存,在Table里每次利用那个图像的时候,只会把图片指针指向同一块内存。这种情况使用imageNamed加载图像就会变得非常有效。
2、利用NSData方式加载时,图像会被系统以数据方式加载到程序。当你不需要重用该图像,或者你需要将图像以数据方式存储到数据库,又或者你要通过网络下载一个很大的图像时,请尽量使用imageWithData的方式加载图像。
无论用哪种方式加载图像,图像使用结束后,一定要记得显示释放内存。