在UIImage处理中,时常会使用到drawInRect方法,但是缺点是内存占用过大,且造成内存泄漏无法回收。这一点是因为对象持有,导致不能及时释放的原因。
多调用几次这个方法,内存就暴增。尽管网络上查找问题的答案,autoRelease释放池也无法处理。
解决方法一:
将UIImage对象本地缓存成图片,然后正常释放对象UIGraphicsEndImageContext(),接着传递出去缓存UIImage的路径进行读取。
解决方法二:
将从上下文获取的新图片压缩处理成新的图片,后续都使用这个压缩后的新图片,压缩之前的从上下文获取的图片及时释放掉,话不多说,代码如下:
UIImageOrientation imageOrientation = image.imageOrientation;
if (imageOrientation != UIImageOrientationUp) {
//开始上下文
UIGraphicsBeginImageContext(image.size);
//将相册的图片绘制到上下文上
[image drawInRect:CGRectMake(0,0,image.size.width,image.size.height)];
//从上下文获取已经绘制好的图片
UIImage * tempImage = UIGraphicsGetImageFromCurrentImageContext();
//将上下文的图片压缩
NSData * tempImageData = UIImageJPEGRepresentation(tempImage, 0.3);
//将压缩的数据转为图片
tempImage = [UIImage imageWithData:tempImageData];
//将原有的相册图片释放掉
if (image) {
image = nil;
}
//将压缩之后的图片赋值给原有的图片地址
image = tempImage;
//关闭上下文
UIGraphicsEndImageContext();
}
instruments实测内存几乎没啥增长