Objective c 在允许自动删除NSMutableData实例的同时使用其字节

Objective c 在允许自动删除NSMutableData实例的同时使用其字节,objective-c,cocoa-touch,memory-management,nsmutabledata,Objective C,Cocoa Touch,Memory Management,Nsmutabledata,我一直在用 NSMutableData* mutableData = [NSMutableData dataWithLength: someLength]; void* bitmapData = [mutableData mutableBytes]; CGContextRef context = CGBitmapContextCreate(bitmapData,...); // ...use context CGContextRelease(context); 我有一个自动释放池,但在工具中查

我一直在用

NSMutableData* mutableData = [NSMutableData dataWithLength: someLength];
void* bitmapData = [mutableData mutableBytes];
CGContextRef context = CGBitmapContextCreate(bitmapData,...);
// ...use context
CGContextRelease(context);
我有一个自动释放池,但在工具中查看时,
mutableData
似乎没有被释放。
我曾想过像下面这样使用
alloc
/
init
,但我不确定发送
release
是否也会清除
位图数据

NSMutableData* mutableData = [[NSMutableData alloc] initWithLength: someLength];
void* bitmapData = [mutableData mutableBytes];
[mutableData release];
//...
在这里使用
NSMutableData
的正确方法是什么


我认为使用
NSMutableData
而不是
malloc()
free()
会很方便,因为它会自动释放。但是现在我不确定这是不是真的。

当你说
mutableData
似乎没有被释放时,你的意思是在
CGContextRelease()
的时候,还是说它从来没有释放过,每次运行它都会泄漏

在第一个示例中,在自动释放池耗尽之前(通常在事件循环结束时),您不会期望
mutableData
解除分配,因为您使用了
-dataWithLength:
。在第二个示例中,未定义是否发布
mutableData
。调用
-mutableBytes
可能会应用retain和autorelease,以确保指针对事件循环的其余部分有效(这在这类方法中非常常见),但文档没有说明,因此如果稍后使用
bitmapData
,则第二个示例是未定义的行为


现在,如果
mutableData
泄漏,那么您可能会在其他地方过度保留它。

询问NSMutableData实例的mutableBytes,只会返回一个指向它为您管理的现有(已分配)缓冲区的指针。从管理的角度来看,它对内存没有任何影响

因此,在第一个示例中,当在工具中查看mutableData时,它似乎没有被释放,这一事实可能与当时的自动释放池环境有关。以这种方式使用可变数据的代码是否有一个NSAutoreleasePool?您是否在控制台中看到类似“在没有池的情况下调用自动释放;只是泄漏”的警告?如果是这样,您只需要将代码包装成:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// bitmap drawing code here
[pool drain];
在第二个示例中,您可以在NSMutableData实例上使用alloc/init,但需要在使用从mutableBytes获得的指针之后释放它。调用release后,指针将指向解除分配(释放)的内存,访问它将导致可怕的EXC_BAD_访问


另外,使用malloc/free可能是我在这里的第一选择,因为您可以非常明确地知道如何以及何时分配和释放内存。NSMutableData+autorelease不会真正为您购买任何东西,除了一些开销,如果您不将对象用于任何其他用途。

是的,即使在CGContextRelease()之后,它也不会处理任何事情。。我不会将原始数据或NSMutableData传递给上下文创建函数以外的任何其他函数。所谓“从不”是指,即使在事件循环完成后,这样当您多次调用此函数时,您的总体内存使用率仍在继续增长?grr,在其他地方存在其他泄漏,保留了从上下文创建的映像,不确定是否保留原始字节,因此也是可变数据。但在排除了其他泄漏后,仪器并没有显示可变数据为活动数据。。也许仪器有问题