为什么我必须释放这些数据?我是老板吗?

时间:2011-06-17 20:32:37

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

这很奇怪。在technical Q & A中,Apple说:

void *data = CGBitmapContextGetData (cgctx);
if (data != NULL)
{

    // **** You have a pointer to the image data ****

    // **** Do stuff with the data here ****

}

// When finished, release the context
CGContextRelease(cgctx); 
// Free image data memory for the context
if (data)
{
    free(data);
}

我查看了CGBitmapContextGetData的文档,并没有提到我在调用它时负责释放数据。已经有CGContextRelease调用来清理上下文。

必须在上下文中额外释放数据有什么意义?它只是指向该数据的指针,对吧?他们为什么在这里打电话给free(data)

2 个答案:

答案 0 :(得分:3)

更新:我忽略了阅读整个代码示例。 Apple在bitmapData中分配CreateARGBBitmapContext()但不释放它。这完全没问题,因为上下文仍然需要吸引它。

但是,bitmapData以后必须在完成绘图时释放,这正是他们在ManipulateImagePixelData()结束时所做的事情。因此,尽管释放通过get函数获得的内容是不常见的,但示例代码是正确的

为了避免释放释放从get函数返回的内容的混淆,人们可能希望将位图数据存储在全局/实例变量中,并在完成后存储free()


我认为这是代码示例中的错误。这个函数的documentation没有提到任何特殊的东西,所以Get Rule没有理由不适用于此。 Quartz 2D Documentation还特别重申CoreFoundation内存管理模型适用于Quartz 2D API。

答案 1 :(得分:1)

我100%不熟悉任何与Apple相关的编码,但我认为cgctx与数据指针无关,所以你必须自己释放它。 I.E. CGContextRelease()不会清理指针。