Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c dataWithBytesNoCopy:长度:内存管理_Objective C_Cocoa_Nsdata - Fatal编程技术网

Objective c dataWithBytesNoCopy:长度:内存管理

Objective c dataWithBytesNoCopy:长度:内存管理,objective-c,cocoa,nsdata,Objective C,Cocoa,Nsdata,我使用dataWithBytesNoCopy:length:方法从字节创建NSData对象 来自apple文档: 返回的对象获取字节指针的所有权并释放它 关于解除分配 我应该释放调用者函数中的返回数据对象吗 -(void)testFunction { NSAutoreleasePool *nsp = [[NSAutoreleasePool alloc] init]; NSData *ldata = [mObject dataFromBytes]; NSlog(@"%@", ldata)//pr

我使用dataWithBytesNoCopy:length:方法从字节创建NSData对象

来自apple文档:

返回的对象获取字节指针的所有权并释放它 关于解除分配

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

-(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。这意味着调用方不会自动获取返回数据的所有权,因此除非保留数据,否则不应释放数据

已被malloc’ed的数据的所有权由NSData对象接管,不应被释放。当NSData实例被释放时,它将释放被释放的内存

在testFunction中,您接收并打印NSData对象。接下来,您将释放自动释放池,这将导致自动释放的对象被释放和解除锁定。您再次打印它,但它已经被解除锁定,这是危险的。我很惊讶它并不总是执行坏访问。

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

更详细的回答:首先,上面代码中的dataFromBytes方法没有返回值,推测这实际上应该返回NSData*

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

已被malloc’ed的数据的所有权由NSData对象接管,不应被释放。当NSData实例被释放时,它将释放被释放的内存


在testFunction中,您接收并打印NSData对象。接下来,您将释放自动释放池,这将导致自动释放的对象被释放和解除锁定。您再次打印它,但它已经被解除锁定,这是危险的。我很惊讶它并不总是执行坏访问。

对象的内存管理规则不会因为对象将拥有其中一个对象而更改论据。是否释放该对象仍由方法的名称决定,如中所述。@PeterHosey谢谢。我还有一个问题。为什么我的应用程序在10.6和10.7上运行良好,在返回的数据对象上发布。它在10.5上有时会崩溃。当你做错事时,你不一定会崩溃。它可能工作,可能崩溃,可能行为不端。结果的不可预测性本身就是确保你正确做事的一个原因偶尔的不当行为比持续的崩溃更令人沮丧,而且两者都不能让你在用户眼中看起来很好。在这种情况下释放对象是错误的,在每个Mac OS X版本上,无论之后发生了什么或没有发生什么。对象的内存管理规则不会因为对象将拥有其中一个参数而改变。是否释放该对象仍由方法的名称决定,如中所述。@PeterHosey谢谢。我还有一个问题。为什么我的应用程序在10.6和10.7上运行良好,在返回的数据对象上发布。它在10.5上有时会崩溃。当你做错事时,你不一定会崩溃。它可能工作,可能崩溃,可能行为不端。结果的不可预测性本身就是确保你正确做事的一个原因偶尔的不当行为比持续的崩溃更令人沮丧,而且两者都不能让你在用户眼中看起来很好。在这种情况下释放对象是错误的,在每一个MacOSX版本上,不管之后发生了什么或没有发生什么。好的。非常感谢。为什么我的应用程序在10.6和10.7上运行良好,在返回的数据对象上发布。它在10.5上有时会崩溃。非常感谢。为什么我的应用程序在10.6和10.7上运行良好,在返回的数据对象上发布。它在10.5上有时会崩溃
-(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

}