2011-01-26 48 views
0

类方法[这是存储器管理澄清/问题]返回对象和所有权转移

  • 我有一个返回一个NSMutableArray *一个类的方法。
  • 我希望调用者拥有它并且必须调用release。
  • 我不想使用AutoRelease,因为一旦调用者完成,我想从内存中释放它。

只要我用new或alloc开始名称,这是正确的吗?

例如

+ (NSMutableArray*) newArrayFromDB 
{ 
    NSMutableArray* myArray = [[NSMutableArray alloc] init]; 
    //stuff to populate array 
    return myArray; 
} 

然后调用者会要求有:

NSMutableArray* test = [ThatClass newArrayFromDB]; 
    //use test 
    [test release]; 

静态分析器似乎认为这是确定......但我想第二个意见...

感谢您的反馈....

+0

你为什么要这样?是什么让这个案例变得特别? – Chuck 2011-01-26 02:29:49

+0

我没有意识到(正如David所指出的那样)默认的自动释放池每次都通过主循环被耗尽。我错误地认为它在游泳池本身超出范围之前不会流失。我现在很高兴地返回一个Autoreleased NSMutableArray。 – 2011-02-22 02:14:11

回答

1

是的,这是做到这一点的方法。

我可能会使用“创建”一词来表明来电者拥有所有权,但新的也没关系。


p.s.使用allocWithZone:如果你想多抓一点速度,NULL是一个比alloc更快的触摸。

+1

使用`new *`而不是`create *`符合内存管理规则。 – 2011-01-26 02:22:39

4

是的,你在做什么是正确的 - 你正确地遵循object ownership policy中的规则。

我可能会提出的唯一问题是I don't want to use AutoRelease because I want it freed from memory as soon as caller is done。默认的自动释放池每次都通过主运行循环排空,所以在大多数情况下,内存很快就会被释放。而且,如果调用者需要尽快强制发布,它可以始终手动分配/排除自动释放池。当然,一种方法是创建两种便利方法+ newArrayFromDB:+arrayFromDB;一个autoreleases和一个没有。