这很奇怪。在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)
?
答案 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()不会清理指针。