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

标签 objective-c cocoa nsdata

我正在使用 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/

相关文章:

ios - IF Else 方法,在 NSString 中

objective-c - 将随机生成的 NSString 添加到 NSMutableArray 的算法

ios - 将 NSData 转换为 SecKeyRef

ios - 将 NSData 转换为可读的 JSON 格式 Swift

objective-c - 设置已保存文件的图标

objective-c - 在 Objective-C 中的循环外声明变量是否有任何优化效果?

iphone - iOS 无法隐藏工具栏 UIbarButtonItem

objective-c - 监视目录时dispatch_source_get_data不返回正确的标志

objective-c - Cocoa:用图像填充 NSBezierPath

iPhone URL 请求 : Add value to HTTP header field