在以下情况下,我对内存管理有点困惑
-(NSData *)getData{
NSData *TempData = [[NSData alloc]init];
return TempData;
}
//in some other method
NSData *NewData = [self getData];
现在的问题是直到何时保留 NewData 以及我应该如何发布它?
在以下情况下,我对内存管理有点困惑
-(NSData *)getData{
NSData *TempData = [[NSData alloc]init];
return TempData;
}
//in some other method
NSData *NewData = [self getData];
现在的问题是直到何时保留 NewData 以及我应该如何发布它?
更改您的代码
-(NSData)getData{
NSData *TempData = [[NSData alloc]init];
return NSData;
}
至
-(NSData)getData{
NSData *TempData = [[NSData alloc]init];
return [TempData autorelease];
}
或仅通过代码释放它
[NewDate release];
我认为问题出在你的吸气剂方法上。它不会返回您保留的 TempData。
它会一直保持活动状态,直到您调用 [newData release],由于分配,您的方法返回一个保留 cout 为 1 的对象,这意味着根据可可内存管理规则,您的方法应该以 new 或 alloc 开头或包含副本,因此将方法名称更改为 newData。
release
完成对象后只需调用:
-(NSData *)newData{
NSData *TempData = [[NSData alloc]init];
return TempData;
}
//in some other method
NSData *NewData = [self newData];
// use data
[NewData release];
编辑:为了符合约定,返回保留对象的方法应以new
. 感谢@PeterSarnowski。
这是此 getter 方法的错误用法。它应该返回一个自动发布的 NSData 副本。调用者可能会或可能不会保留自动发布的副本。如果它被保留,调用者有责任释放它。
其次是这个方法的一个错字,它应该是 NSData*。我的错字作为回报。感谢 Peter Sarnowski 的指点。
-(NSData *)getData {
NSData *tempData = [NSData data];
return tempData;
}
调用者可以使用以下代码保留它:
NSData *myData = [[self getData] retain];
//Some code
[myData release];
如果调用者对保留这个对象不感兴趣,他只会调用
NSData *myData = [self getData];
并在调用它的同一函数中使用。