gpt4 book ai didi

objective-c - 数据带字节无复制 :length: memory management

转载 作者:行者123 更新时间:2023-12-03 16:50:44 26 4
gpt4 key购买 nike

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

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

来自苹果文档:

The returned object takes ownership of the bytes pointer and frees it on deallocation.

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

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

}

最佳答案

简短回答:不,调用者只应在保留返回数据的情况下释放它。在您的 testFunction 中,您尚未保留它,因此不应释放它。

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

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

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

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

关于objective-c - 数据带字节无复制 :length: memory management,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10259845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com