iOS CGBitmapContextCreateImage() 内存释放

/ 0评 / 0

之前在做去紫边的时候用到了iOS中底层的一些函数,但是每次使用内存都会飙升,多用几次直接内存爆炸了。
经过查询才知道是因为底层的一些函数开辟的内存系统是没有管理的,也就是没有释放掉,所以需要手动释放,但是还不能直接获取图片,不然那会报错,要像下面我写的这样去操作。
另外data这个字符数组是使用calloc()函数声明的内存,使用之后一定要记得free()掉,不然也会一直占用内存,来看代码:

size_t width = CGImageGetWidth(newImage.CGImage); // 图片宽度
size_t height = CGImageGetHeight(newImage.CGImage); // 图片高度
size_t size = width * height * 4;
unsigned char *data = calloc(size, sizeof(unsigned char)); // 取图片首地址
size_t bitsPerComponent = 8; // r g b a 每个component bits数目
size_t bytesPerRow = width * 4; // 一张图片每行字节数目 (每个像素点包含r g b a 四个字节)
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); // 创建rgb颜色空间
CGRect rect = CGRectMake(0, 0, width, height);

CGContextRef context =
CGBitmapContextCreate(data,
                      width,
                      height,
                      bitsPerComponent,
                      bytesPerRow,
                      space,
                      kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextDrawImage(context, rect, newImage.CGImage);


CGImageRef rcgimage = CGBitmapContextCreateImage(context);
UIImage *result = [UIImage imageWithCGImage:rcgimage];
CGImageRelease(rcgimage);

free(data);
data = nil;
CGColorSpaceRelease(space);
CGContextRelease(context);
UIGraphicsEndImageContext();

评论已关闭。