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

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

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

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

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

直到现在,我一直认为只要调用此方法的调用者在使用后释放 CGContextRef 就一切正常:CGContextRelease(theContext);

来自CGBitmapContextCreate的文档:

In iOS 4.0 and later, and Mac OS X v10.6 and later, you can pass NULL if you want Quartz to allocate memory for the bitmap. This frees you from managing your own memory, which reduces memory leak issues.

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

所以我必须这样做:

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

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

最佳答案

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

请参阅我对 your other question 的(更正)回答.

如果您使用 NULL 选项(即,如果您 malloc() 您的位图数据),我希望数据指针在您之前有效CGContextRelease() 你的上下文。所以你要么需要在释放上下文之前对数据做任何你想做的事情,要么将位图数据复制到某个地方(在这种情况下你也可以预先 malloc() 内存和将其传递给上下文)。

关于objective-c - 创建 CGContextRef 时如何正确清理内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6391664/

相关文章:

iphone - 为 UIView 添加时 UITapGestureRecognizer 无法工作无法检测到问题

ios - 将 cell.textLabel.text 存储在 NSString 中

IOS 如何获取已部署应用程序的 csr 文件

memory-management - Elixir/Erlang 如何管理函数调用中传递的变量的内存?

ios - Xcode如何自动完成动态方法

ios - 使用 NSURLSession 发出 http DELETE 请求

iPhone - 如何处理内存不足的情况

arrays - Swift:如何为 SKSpriteNodes 保留容量()

ios - 在 GameScene.sks 中制作 Sprite 并在代码中访问它

iphone - iOS - 解析后保存xml数据