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)
简短回答:不,调用者只有在保留它的情况下才会释放返回的数据.在你的testFunction你没有保留它所以你不应该释放它.
更长的答案:首先,dataFromBytes上面代码中的方法没有返回值,可能这应该实际返回NSData *.
无论如何,该dataWithBytesNoCopy:length:方法返回一个自动释放的NSData实例,该实例立即从该方法返回.我们知道它是自动释放的,因为方法名称不包含init,new或copy.这意味着调用者不会自动获取返回数据的所有权,因此不应释放它(除非它保留它).
data已经过malloc的所有权由NSData对象接管,不应该被释放.当NSData实例被解除分区时,它将释放malloc的内存.
在你的,testFunction你正在接收NSData对象并打印它.接下来,释放自动释放池,这将导致自动释放的对象被释放并解除分配.你再次打印它,但它已被dealloc'ed这是危险的(我很惊讶它并不总是EXC_BAD_ACCESS.
| 归档时间: |
|
| 查看次数: |
1536 次 |
| 最近记录: |