iOS 使用CoreGraphics框架内存暴涨问题

Core Graphics是一套提供2D绘图功能的C语言的API,使用C结构和C函数模拟了一套面向对象的编程机制,并没有Objective-C对象和方法,而Core Graphics中最重要的“对象”是图形上下文(graphics context),图形上下文是CGContextRef的“对象”,负责存储绘画状态(例如画笔颜色和线条粗细)和绘制内容所处的内存空间。
简单来说,一般使用Core Graphics生成的"对象",需要开发者手动释放.比如常用的对图片进行像素处理:

#define Mask8(x) ( (x) & 0xFF )
#define R(x) ( Mask8(x) )
#define G(x) ( Mask8(x >> 8 ) )
#define B(x) ( Mask8(x >> 16) )
#define A(x) ( Mask8(x >> 24) )
#define RGBAMake(r, g, b, a) ( Mask8(r) | Mask8(g) << 8 | Mask8(b) << 16 | Mask8(a) << 24 )


- (void)imagePixed
{
    
    // 1. Get the raw pixels of the image
    //定义最高32位整形指针 *inputPixels
    UInt32 * inputPixels;
    
    //转换图片为CGImageRef,获取参数:长宽高,每个像素的字节数(4),每个R的比特数
    CGImageRef inputCGImage = [self.image CGImage];
    NSUInteger inputWidth = CGImageGetWidth(inputCGImage);
    NSUInteger inputHeight = CGImageGetHeight(inputCGImage);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    
    NSUInteger bytesPerPixel = 4;
    NSUInteger bitsPerComponent = 8;
    
    //每行字节数
    NSUInteger inputBytesPerRow = bytesPerPixel * inputWidth;
    
    //开辟内存区域,指向首像素地址
    inputPixels = (UInt32 *)calloc(inputHeight * inputWidth, sizeof(UInt32));
    
    //根据指针,前面的参数,创建像素层
    CGContextRef context = CGBitmapContextCreate(inputPixels, inputWidth, inputHeight,
                                                 bitsPerComponent, inputBytesPerRow, colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    //根据目前像素在界面绘制图像
    CGContextDrawImage(context, CGRectMake(0, 0, inputWidth, inputHeight), inputCGImage);
    
    //像素处理--------------------------------------------------------
    for (int j = 0; j < inputHeight; j++) {
        for (int i = 0; i < inputWidth; i++) {
            UInt32 * currentPixel = inputPixels + (j * inputWidth) + i;
            UInt32 color = *currentPixel;
            UInt32 br,thisR,thisG,thisB,thisA;
            //这里直接移位获得RBGA的值,
            thisR=R(color);
            thisG=G(color);
            thisB=B(color);
            thisA=A(color);
            //NSLog(@"%d,%d,%d,%d",thisR,thisG,thisB,thisA);
                *currentPixel = RGBAMake(thisR, thisG, thisB, thisA);
                
     
        }
    }

 
    // 4. 释放
    CGColorSpaceRelease(colorSpace);
    CGContextRelease(context);
    free(inputPixels);
    
    self.image = processedImage;
}

以上代码有三处需要手动释放,不然会造成内存暴涨.因为ARC后平时开发不是太经常需要开发者手动释放内存,所以有时会忽略掉,一般用到Core Graphics框架的时候,有CG...Create字样或者直接calloc开辟内存,都需要注意最后手动释放.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎。它提供了低...
    ShanJiJi阅读 5,560评论 0 20
  • --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益...
    韩七夏阅读 7,841评论 2 10
  • 生活百味,你时常留念什么味道呢我们在世界上因为有很多的风景和事务相随,是它们带给我们灵感和启发,有时候很感谢时间让...
    换氧阅读 3,544评论 0 1
  • 生活像一碗五味杂陈的白开水 工作像五颜六色的白加黑 大海游泳的鸡 天空飞翔的鱼 白天的星星超级耀眼 晚上的太阳十分...
    府罗将相阅读 2,833评论 0 0
  • Tcode : SE24 查找某个TCODE的对应的BADI 以F-03为例另开一个窗口进入F-03,这时断点生...
    Mmm_余安阅读 4,235评论 0 2

友情链接更多精彩内容