美文网首页
使用CGImageRelease造成应用崩溃 .cxx_dest

使用CGImageRelease造成应用崩溃 .cxx_dest

作者: WSGNSLog | 来源:发表于2016-11-07 09:52 被阅读555次

    #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_dest

          本文链接:https://www.haomeiwen.com/subject/vrznuttx.html