Objective c 为什么我必须释放这些数据?我是主人吗?

Objective c 为什么我必须释放这些数据?我是主人吗?,objective-c,ios,memory-management,core-graphics,Objective C,Ios,Memory Management,Core Graphics,这很奇怪。在一份声明中,苹果表示: 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);

这很奇怪。在一份声明中,苹果表示:

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调用


必须在上下文中额外释放数据有什么意义?它只是一个指向那个数据的指针,对吗?为什么他们在这里称之为免费(数据)?

我对编写任何与苹果相关的代码都100%不熟悉,但我认为cgctx与数据指针无关,所以你必须自己释放它。也就是说,CGContextRelease()不会清理指针。

更新:我忽略了阅读整个代码示例。苹果在
CreateARGBBitmapContext()
中分配
bitmapData
,但没有释放它。这是非常好的,因为上下文仍然需要引入它

但是,
bitmapData
在完成绘图后必须释放,这正是他们在
manufactualImagePixelData()的末尾所做的。因此,尽管释放通过get函数获得的内容是不寻常的,但示例代码是正确的

为了避免释放从get函数返回的内容时出现混淆,可能需要将位图数据存储在全局/实例变量中,并在完成时存储该变量



我假设这是代码示例中的一个bug。此函数的函数没有提到任何特殊的内容,因此没有理由不在此处应用。还特别重申CoreFoundation内存管理模型适用于Quartz 2D API。

那么free与release有什么不同?免费到底做什么?据我所知,它与malloc相反。但是我不做任何malloc。
free()
release
是完全不同的。
free()
函数可立即释放内存,无需提问。Objective-C中的
release
方法(以及
CFRelease
函数)仅将对象的参考计数减少1。只有当引用计数达到零时,对象才是
dealloc
ed,其内存
free()
d。那么,我们是否最好释放()位图数据对象,而不是释放()?@Mikhalo Ivanokov:不,因为你不能这样做<代码>发布
是一条消息;您只能向Cocoa或CF对象发送消息。为您分配的缓冲区
malloc
不是Cocoa或CF对象;它只是一个字节数组,仅此而已,没有任何引用来计数它(因此您无法通过任何方式保留或释放它)。与malloc相对应的是免费的;这就是必须使用的方法来破坏缓冲区。用核心基础内存管理指南的创建和获取规则来解释这一点,将直接得出这样的结论:事实上,您并不拥有那个空指针。问得好,我没想到要把它放出来。@马特·威尔丁:你说得对:拿到那个指针并不意味着你需要放出来。如果Quartz在创建上下文时为您分配了它,Quartz将负责释放它。如果您分配了它并将其提供给上下文使用,那么您仍有责任释放它。
CGBitmapContextGetData
调用在任何情况下都不会改变任何内容。