创建CGContextRef时如何正确清理内存?

Pro*_*ber 5 memory-management core-graphics objective-c ios

使用手动创建CGContextRef时CGBitmapContextCreate(),是否还必须手动释放位图数据?

现在,我正在这样做:我有一个创建并返回CGContextRef的方法。在该方法内,我还为该上下文创建数据,如下所示:

bitmapData = malloc(bitmapByteCount);
context = CGBitmapContextCreate(bitmapData, ...);
return context;
Run Code Online (Sandbox Code Playgroud)

到现在为止,我一直相信,当此方法的调用者在使用CGContextRef之后简单地释放它时,一切都很好: CGContextRelease(theContext);

从以下文档中CGBitmapContextCreate

在iOS 4.0和更高版本以及Mac OS X v10.6和更高版本中,如果希望Quartz为位图分配内存,则可以传递NULL。这使您无需管理自己的内存,从而减少了内存泄漏问题。

这使我认为使用上下文后确实必须释放两件事,这是为我创建的一种便捷方法:释放上下文的位图数据,然后释放上下文本身。

因此,我必须这样做:

void *data = CGBitmapContextGetData(context);
if (data != NULL) {
    free(data);
}
Run Code Online (Sandbox Code Playgroud)

因此,如果我不重构所有代码以释放位图数据,而不仅是上下文,我是否会在这里发生大量内存泄漏?

puz*_*zle 3

是的。如果你编辑它,你最终必须使用free()bitmapData (一旦 CGContext 完成绘制等)malloc()

请参阅我对您的其他问题的(更正的)答案。

如果您使用 NULL 选项(即,如果您没有使用 malloc()bitmapData),我希望数据指针在您CGContextRelease()使用上下文之前一直有效。因此,您要么需要在释放上下文之前对数据执行任何您想要执行的操作,要么将位图数据复制到某处(在这种情况下,您也可以malloc()事先复制内存并将其传递给上下文)。