目标C内存管理在两种方法之间

时间:2012-06-29 10:19:14

标签: objective-c memory-management

我对以下场景中的内存管理感到困惑

-(NSData *)getData{ 
    NSData *TempData = [[NSData alloc]init];
    return TempData; 
  }

 //in some other method
 NSData *NewData = [self getData];

现在的问题是,何时保留NewData以及我应该如何发布它?

4 个答案:

答案 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。