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

时间:2011-06-17 20:50:11

标签: objective-c ios memory-management core-graphics

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

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

bitmapData = malloc(bitmapByteCount);
context = CGBitmapContextCreate(bitmapData, ...);
return context;

到目前为止,我总是相信当这个方法的调用者在使用它之后释放CGContextRef时,一切都很好:CGContextRelease(theContext);

来自CGBitmapContextCreate的文档:

  

在iOS 4.0及更高版本和Mac OS X中   v10.6及更高版本,如果可以传递NULL   你希望Quartz为其分配内存   位图。这让你从中解脱出来   管理自己的记忆,哪个   减少内存泄漏问题。

这让我觉得在使用我为我创建的便捷方法的上下文之后我必须发布两件事:释放上下文的位图数据,然后释放上下文本身。

所以我必须这样做:

void *data = CGBitmapContextGetData(context);
if (data != NULL) {
    free(data);
}

如果我不重构所有代码以释放位图数据,而不仅仅是上下文,那么我在这里有大量内存泄漏吗?

1 个答案:

答案 0 :(得分:3)

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

查看your other question的答案(已更正)。

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