1

我正在dataWithBytesNoCopy:length:使用NSDatabytes.

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

来自苹果文档:

返回的对象获取字节指针的所有权并在释放时释放它。

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

-(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

}
4

1 回答 1

7

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

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

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

已分配的所有权data由 NSData 对象接管,不应被释放。当 NSData 实例被解除分配时,它将释放被分配的内存。

在你的,testFunction你正在接收NSData对象并打印它。接下来释放自动释放池,这将导致自动释放的对象被释放和释放。您再次打印它,但它已经被释放,这很危险(我很惊讶它并不总是EXC_BAD_ACCESS.

于 2012-04-21T14:41:15.773 回答