1

在以下情况下,我对内存管理有点困惑

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

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

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

4

4 回答 4

2

更改您的代码

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

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

或仅通过代码释放它

[NewDate release];

我认为问题出在你的吸气剂方法上。它不会返回您保留的 TempData。

于 2012-06-29T10:22:44.937 回答
1

它会一直保持活动状态,直到您调用 [newData release],由于分配,您的方法返回一个保留 cout 为 1 的对象,这意味着根据可可内存管理规则,您的方法应该以 new 或 alloc 开头或包含副本,因此将方法名称更改为 newData。

于 2012-06-29T10:25:37.823 回答
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。

于 2012-06-29T10:22:18.130 回答
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];

并在调用它的同一函数中使用。

于 2012-06-29T10:23:51.263 回答