在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实测内存几乎没啥增长

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐