1.为什么尽量避免使用imageNamed?
使用这种方式生成的对象被autorelease之后,图片依然存在于内存,并不会及时回收,并且没有明确的释放方法。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存。
这是为什么?如果对于大量同一图片的复,使用这个方法可行。以这种方式加载的图片会缓存一份在内存中,以后如果发现有同名的图片,则不会再次加载。缺点是这份缓存无法预知释放时间与条件。
2.最好使用方式:imageWithContentsOfFile,根据文件路径加载图片。这种方式加载的图片不会缓存在内存中,当对象被释放之后,图片也会被释放。
#define recourcesPath [[NSBundle mainBundle] resourcePath]
NSString * imageFile = [[NSString alloc] initWithFormat:@"%@/%@",recourcesPath, filename];
UIImage * tempImage = nil;
tempImage = [[UIImage alloc] initWithContentsOfFile:imageFile];
[imageFile release];
imageFile = nil;
这样得到的图片tempImage,并不是autorelease,这可以手动释放,释放的时候已将图片从内存中清除,可控内存是它的优点。
3.2中提到的加载方式,可以封装成一个类似于imageNamed的方法。新建一个UIImage Category,将2中的代码封装成一个函数即可。
参考:http://www.cnblogs.com/zeejun/archive/2012/05/08/2485535.html
参考:stackoverflow.com
DEMOURL : http://download.csdn.net/detail/take8619702/4918991