我对以下场景中的内存管理感到困惑
-(NSData *)getData{
NSData *TempData = [[NSData alloc]init];
return TempData;
}
//in some other method
NSData *NewData = [self getData];
现在的问题是,何时保留NewData以及我应该如何发布它?
答案 0 :(得分:2)
从
更改您的代码-(NSData)getData{
NSData *TempData = [[NSData alloc]init];
return NSData;
}
到
-(NSData)getData{
NSData *TempData = [[NSData alloc]init];
return [TempData autorelease];
}
或仅通过代码
发布[NewDate release];
我觉得问题出在你的getter方法中。 它不会返回您保留的TempData。
答案 1 :(得分:1)
完成对象后,只需致电release
:
-(NSData *)newData{
NSData *TempData = [[NSData alloc]init];
return TempData;
}
//in some other method
NSData *NewData = [self newData];
// use data
[NewData release];
编辑:为了符合约定,返回保留对象的方法应以new
开头。感谢@PeterSarnowski。
答案 2 :(得分:1)
这是此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];
并在调用它的同一函数中使用。
答案 3 :(得分:1)
它将保持活着,直到你调用[newData release],你的方法返回一个对象,由于alloc的保留cout为1,这意味着根据可可内存管理规则,你的方法应该以new或alloc开头或者包含副本,因此将方法名称更改为newData。