iOS CGBitmapContextCreate复制数据吗?

时间:2012-02-25 13:10:47

标签: ios memory-leaks cgbitmapcontextcreate

我写了这段代码:

 bitmapData = calloc(1, bitmapByteCount );
 context = CGBitmapContextCreate (bitmapData,
                                 pixelsWide,
                                 pixelsHigh,
                                 8,
                                 bitmapBytesPerRow,
                                 colorSpace,
                                 kCGImageAlphaOnly);

当我这样做时,CGBitmapContext是否复制了我的bitmapData,所以在这些行后我应该写

free(bitmapData); 

2 个答案:

答案 0 :(得分:5)

如果您需要bitmapData,请不要将其释放。如果您不需要它,请将NULL作为参数传递,Quartz将自行分配内存(iOS 4.0及更高版本)。

  

数据:指向要在其中呈现图形的内存中的目标的指针。此内存块的大小应至少为(bytesPerRow * height)字节。   在iOS 4.0及更高版本以及Mac OS X v10.6及更高版本中,如果希望Quartz为位图分配内存,则可以传递NULL。这使您无需管理自己的内存,从而减少了内存泄漏问题。

但是Quartz没有复制bitmapData,它会在那里进行渲染。释放context后,你应该释放那段记忆。

编辑:在Apple样本projects之一中,内存被释放,但不是立即释放:

float drawStage3(CGContextRef context, CGRect rect)
{
    // ...
    cachedData = malloc( (((ScaledToWidth * 32) + 7) / 8) * ScaledToHeight);
    // ...
    bitmapContext = CGBitmapContextCreate(cachedData /* data */,
    // ...
    CFRelease(bitmapContext);
    // ...
    // Clean up
    CFRelease(cachedImage);
    free(cachedData);
}

答案 1 :(得分:1)

编辑:

您的代码通过calloc分配内存块 - 您拥有该内存块。所以,你拥有free那个记忆。 CGBitmapContext创建只是使用您创建的内存块创建上下文(这就是您必须将其传入的原因)。当你完成那块内存后,你应该释放它。

我会首先在上下文中进行CFRelease。 CFRelease将负责上下文创建的任何资源。

Core Foundation Memory Guide中的“创建规则”:

  

Core Foundation函数的名称表明您拥有的时间   返回的对象:

     

在名称中嵌入“创建”的对象创建函数;   对象复制函数,名称中嵌入了“复制”。如果   你拥有一个物体,你有责任放弃所有权   (完成后使用CFRelease)。