简书上的文章已经不再维护,有兴趣阅读其他文章,或一起交流的朋友,请移步 我的博客:punmy.cn
原文
- 加载
谨慎使用
[UIImage imageNamed:]
,imageNamed会做缓存,一般用于加载app生命周期内频繁被使用的图片和UI资源,有助于加快加载速度。而对于一次性使用的UI资源、尺寸过大的图片,不建议使用。对于一次性使用、尺寸较大的图片资源,可以通过路径的方式创建UIImage:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"image_mic" ofType:@"png"];
[UIImage imageWithContentsOfFile:imagePath];-
imageNamed缓存过的图片,如果有指向其CGImage的CGImageRef,不能随意释放,一旦释放,后续再次使用imageNamed创建图片,就会得到野指针。更有甚者,可能导致内存疯狂暴增,使整个iOS系统瘫痪。(iPod touch 5 - iOS 8.0执行如下代码时秒崩,只能通过重启来恢复)
UIImage superImage = [UIImage imageNamed:@"image_mic.png"];
CGImageRef imageRef = superImage.CGImage;
/* 做一些操作。。。 */
//相当于释放掉了UIImage的缓存
CGImageRelease(imageRef);//再次创建UIImage,得到野指针(在此处概率性崩溃) UIImage *superImage = [UIImage imageNamed:@"image_mic.png"]; //再次引用野指针 CGImageRef imageRef = superImage.CGImage; //对野指针进行释放操作,内存泄漏,重复几次后iPod touch 5 系统崩溃 CGImageRelease(imageRef); // bomb!!!
- 图片方向
- 部分加载的图片附带Exif信息,需要注意在处理之前进行方向矫正,否则在处理后可能会图片数据错误,如图片方向总是颠倒。
- 图片保存
- 将图片保存到相册,通过UIImage格式保存,系统在编码成JPEG格式存在压缩,对于反复处理反复保存同一张图片会造成图片质量变差出现问题。务必保存的时候手动编码格式,并把质量设置为最大值。