我写了这段代码:
bitmapData = calloc(1, bitmapByteCount );
context = CGBitmapContextCreate (bitmapData,
pixelsWide,
pixelsHigh,
8,
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaOnly);当我这样做时,CGBitmapContext复制了我的bitmapData,所以在这些行之后,我应该写
free(bitmapData); 发布于 2012-02-25 21:35:14
如果你需要bitmapData,不要释放它。如果您不需要它,请将Quartz作为参数传递,Quartz将自行分配内存(iOS 4.0及更高版本)。
data:指向要渲染图形的内存目标的指针。此内存块的大小应至少为(bytesPerRow*height)字节。在Quartz 4.0及更高版本和Mac v10.6及更高版本中,如果希望iOS为位图分配内存,则可以传递NULL。这将使您从管理自己的内存中解脱出来,从而减少内存泄漏问题。
但是Quartz没有复制bitmapData,它在那里进行渲染。在释放context之后,您应该释放该内存。
编辑:在苹果的一个示例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);
}发布于 2012-02-25 21:13:41
编辑:
您的代码正在通过calloc分配一个内存块-您拥有该内存块。所以,你拥有那个内存中的free。CGBitmapContext create只是使用您创建的内存块创建一个上下文(这就是您必须传递它的原因)。当你使用完那块内存时,你应该释放它。
我会先在上下文上执行CFRelease。上下文创建的任何资源都将由CFRelease处理。
Core Foundation Memory Guide中的“创建规则”表示:
核心基础函数的名称表示您何时拥有返回的对象:
名称中嵌入了“Create”的对象创建函数;名称中嵌入了“Copy”的对象复制函数。如果你拥有一个对象,当你使用完它时,你有责任放弃所有权(使用CFRelease)。
https://stackoverflow.com/questions/9444295
复制相似问题