使用CGImageRelease造成应用崩溃 .cxx_destruct

#3 0x0000000180b8ab54 in object_cxxDestructFromClass(objc_object*, objc_class*) ()
#2 0x0000000100705a70 in -[xxViewController .cxx_destruct] at /Users/.../Class/Controllers/PicBeautyHomeVC.m:37

{
CGImageRef imgRef = self.imageView.image.CGImage;
CGFloat w = CGImageGetWidth(imgRef);
CGFloat h = CGImageGetHeight(imgRef);

//以1.png的图大小为画布创建上下文
//UIGraphicsBeginImageContext(CGSizeMake(w, h));
UIGraphicsBeginImageContextWithOptions(self.showImg.size, NO, 0);
[self.imageView.image drawInRect:CGRectMake(0, 0, w, h)];//先把image画到上下文中
UIImage *resultImg = UIGraphicsGetImageFromCurrentImageContext();//从当前上下文中获得最终图片
UIGraphicsEndImageContext();//关闭上下文

CGImageRelease(imgRef);
return resultImg;
}

在CFRelease的解释中,提到要release的对象不能是NULL,若是NULL的话,会引起runtime的错误并且程序将要crash。加之在网上找到的另一种解释是,使用release后,程序并非直接就release了对象,一般都是有延迟的,可见这个崩溃可能是第一次的延迟释放对象造成的。而更直接的原因在于CGImageRef对象没有使用creat 或retain(imageView.image) ,所以这个CGImageRef对象的内存管理就不需要手动处理了,系统会进行自动的释放,只有当CGImageRef使用creat或retain后才要手动release。

两种解决方法:将原图进行retain或者去掉CGImageRelease(imageRef)后程序运行正常。

方法一:

CGImageRef imgRef = self.imageView.image.CGImage;
UIGraphicsBeginImageContextWithOptions(self.showImg.size, NO, 0);
[self.imageView.image drawInRect:CGRectMake(0, 0, w, h)];//先把image画到上下文中
UIImage *resultImg = UIGraphicsGetImageFromCurrentImageContext();//从当前上下文中获得最终图片
UIGraphicsEndImageContext();//关闭上下文

//CGImageRelease(imgRef);//不需要release

方法二:

@property (retain,nonatomic) UIImage *showImg;

CGImageRef imgRef = self.showImg.CGImage;
UIGraphicsBeginImageContextWithOptions(self.showImg.size, NO, 0);
[self.imageView.image drawInRect:CGRectMake(0, 0, w, h)];//先把image画到上下文中
UIImage *resultImg = UIGraphicsGetImageFromCurrentImageContext();//从当前上下文中获得最终图片
UIGraphicsEndImageContext();//关闭上下文

CGImageRelease(imgRef);

参考:https://blog.csdn.net/u014231427/article/details/50358608

你可能感兴趣的:(使用CGImageRelease造成应用崩溃 .cxx_destruct)