【问题标题】:How to correctly clean up the memory when creating a CGContextRef?创建CGContextRef时如何正确清理内存?
【发布时间】:2011-09-17 12:18:14
【问题描述】:

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

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

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

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

来自CGBitmapContextCreate的文档:

在 iOS 4.0 及更高版本以及 Mac OS X 中 v10.6 及更高版本,您可以传递 NULL if 你想让 Quartz 分配内存 位图。这让你从 管理自己的记忆, 减少内存泄漏问题。

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

所以我必须这样做:

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

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

【问题讨论】:

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


    【解决方案1】:

    是的。如果您 malloc()ed 它,您最终必须 free() bitmapData(一旦 CGContext 完成绘制等)。

    查看我对your other question 的(更正后的)回答。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 2021-06-26
      • 1970-01-01
      相关资源
      最近更新 更多