我写了这段代码:
bitmapData = calloc(1, bitmapByteCount );
context = CGBitmapContextCreate (bitmapData,
pixelsWide,
pixelsHigh,
8,
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaOnly);
当我这样做时,CGBitmapContext是否复制了我的bitmapData,所以在这些行后我应该写
free(bitmapData);
答案 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)。