dataWithBytesNoCopy:length:内存管理

Par*_*fna 1 cocoa objective-c nsdata

我正在使用dataWithBytesNoCopy:length:方法来创建NSData对象bytes.

-(NSData *)dataFromBytes
{ 
...
   void *data = malloc(bytes);
... 
    return [NSData dataWithBytesNoCopy:data length:bytes];;
}
Run Code Online (Sandbox Code Playgroud)

从苹果文档:

返回的对象获取字节指针的所有权,并在取消分配时释放它.

我应该在调用函数中释放返回数据对象吗?

-(void)testFunction
{
NSAutoreleasePool *nsp = [[NSAutoreleasePool alloc] init];

NSData *ldata = [mObject dataFromBytes];
NSlog(@"%@", ldata)//printing data
[nsp release];
NSlog(@"%@", ldata)//Not printing data //sometimes getting exc_bad_access

}
Run Code Online (Sandbox Code Playgroud)

mtt*_*trb 7

简短回答:不,调用者只有在保留它的情况下才会释放返回的数据.在你的testFunction你没有保留它所以你不应该释放它.

更长的答案:首先,dataFromBytes上面代码中的方法没有返回值,可能这应该实际返回NSData *.

无论如何,该dataWithBytesNoCopy:length:方法返回一个自动释放的NSData实例,该实例立即从该方法返回.我们知道它是自动释放的,因为方法名称不包含init,new或copy.这意味着调用者不会自动获取返回数据的所有权,因此不应释放它(除非它保留它).

data已经过malloc的所有权由NSData对象接管,不应该被释放.当NSData实例被解除分区时,它将释放malloc的内存.

在你的,testFunction你正在接收NSData对象并打印它.接下来,释放自动释放池,这将导致自动释放的对象被释放并解除分配.你再次打印它,但它已被dealloc'ed这是危险的(我很惊讶它并不总是EXC_BAD_ACCESS.