2011-01-26 61 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和一個沒有。