• 在arc模式下 CGImage 释放问题


     //大图bigImage


        //定义myImageRect,截图的区域

        if (imagecount >= 3) {

            CGRect myImageRect;

            if (i.size.width<= i.size.height) {

                myImageRect = CGRectMake(0.0150.0, i.size.width, i.size.width);

            }

            else

                myImageRect = CGRectMake(0.0150.0, i.size.height, i.size.height);

            

            UIImage* bigImage= i;

            

            CGImageRef imageRef = bigImage.CGImage;

            

            CGImageRef subImageRef = CGImageCreateWithImageInRect(imageRef, myImageRect);

            CGSize size;

            

            size.width = 80;

            

            size.height = 80;

            

            UIGraphicsBeginImageContext(size);

            

            CGContextRef context = UIGraphicsGetCurrentContext();

            

            CGContextDrawImage(context, myImageRect, subImageRef);

            

            UIImage* smallImage = [UIImage imageWithCGImage:subImageRef];

            CGImageRelease(subImageRef);

            UIGraphicsEndImageContext();

            

            

            return smallImage;


        }

        

        if (imagecount < 3) {

            CGRect myImageRect;

            if (i.size.width<= i.size.height) {

                myImageRect = CGRectMake(0.0150.0, i.size.width, i.size.width*2/3);

            }

            else

                myImageRect = CGRectMake(0.0150.0, i.size.height, i.size.height*2/3);

            

            UIImage* bigImage= i;

            

            CGImageRef imageRef = bigImage.CGImage;

            

            CGImageRef subImageRef = CGImageCreateWithImageInRect(imageRef, myImageRect);

            CGSize size;

            

            size.width = 120;

            

            size.height = 80;

            

            UIGraphicsBeginImageContext(size);

            

            CGContextRef context = UIGraphicsGetCurrentContext();

            

            CGContextDrawImage(context, myImageRect, subImageRef);

            

            UIImage* smallImage = [UIImage imageWithCGImage:subImageRef];   //注意蓝色的部分

            CGImageRelease(subImageRef);


            

            

            return smallImage;

            

        }

        return nil;

       

    }



    像这样 裁剪图片 就会有内存泄漏 

    后来上 stackoverflow 查找 发现这样一段话

    ARC does not manage C-types, of which CGImage may be considered. You must release the ref manually when you are finished with CGImageRelease(image);


       UIImage* smallImage = [UIImage imageWithCGImage:subImageRef];

            CGImageRelease(subImageRef);

            UIGraphicsEndImageContext();

    也就是 在arc模式下 不是什么东西 都可以释放 例如 C-types的对象 都需要手动来进行释放 
  • 相关阅读:
    映射dll到r0的高维注入
    winrar 去广告的姿势
    利用Hook的方式监控powershell的命令行参数
    读取QQ ClientKey失败分析
    Java——集合——泛型——泛型的概念&使用泛型的好处
    Java——集合——Collection集合——Iterator接口介绍&迭代器的代码实现&迭代器的实现原理&增强for循环
    Java——包装类详解
    Java——集合——泛型——定义和使用含有泛型的方法
    Java——Object类详解
    Java——集合——泛型——定义和使用含有泛型的类
  • 原文地址:https://www.cnblogs.com/melons/p/5791963.html
Copyright © 2020-2023  润新知