2011-05-15 64 views
2

我一直髮現這個混淆。有人可以爲我解釋嗎?意見和其他物體的泄漏

在一個視圖控制器類中,例如,我有一個滾動視圖,我想向它添加一些視圖。所以我在視圖控制器中創建了一個幫助器方法,該方法創建視圖並將其返回給調用者。調用者又將這個新視圖添加到滾動視圖。

所以在這裏我所說的方法來獲取視圖並將其直接傳遞到addSubView:

[scrollView addSubView:[self getView]]; 

這裏是創建視圖的方法:

-(UIView *)getView { 

    UIView *v = [[UIView alloc] init]; 

    // do all the guff I need to configure the view 

    return v; 
} 

的問題是在何時何地v獲得發佈嗎?我是否應該在getView中創建時將它指定爲autorelease或者在我呼叫addSubView:之後是否釋放它?謝謝。

回答

2

由於-[UIView addSubview:]通過發送一個-retain消息獲得傳入的視圖的所有權,你應該發送的getView-autorelease消息返回值:

return [v autorelease]; 
+0

謝謝你;-) – user7865437 2011-05-15 11:38:01

+1

如果你一次只考慮一塊代碼,這些內存管理問題就容易多了。考慮你的助手方法:你創建一個對象,你必須釋放/ autorelease它。退出後發生的事情與您的方法無關。 – kubi 2011-05-15 19:41:49

+1

當調用你的助手方法時:方法簽名('getView')將會按照慣例返回一個自動釋放對象。如果你想獲得所有權,保留這個對象,否則什麼也不要做。 – kubi 2011-05-15 19:43:19

0

雅各布的結論是正確的,但他的理由是錯誤的,或者至少不清楚的(我嘗試過,但是沒有把它變成評論)。

getSubview:中,您已經創建了一個對象。你現在是所有者*。該方法結束後,您必須釋放該對象,放棄您的所有權,否則將泄漏。您從方法中返回對象的事實對此規則沒有任何影響。

在這種情況下,因爲你想要的調用此方法要能夠做到東西與對象的代碼,您使用autorelease,說:「我放棄我的所有權,但實際上並沒有擺脫這個對象直到調用代碼有機會看到它是否想要提出索賠「。對於getSubview:中的代碼,另一端會發生什麼(保留,複製,立即發佈,任何內容)。所有該方法需要做的就是擔心它擁有的內存。否則,即依靠調用代碼將執行特定內存的事實將導致錯誤。

用稍微更專業的術語來說,由v指向的對象必須是釋放或自動釋放的,因爲v即將在方法結束時超出範圍。一旦名稱超出了範圍,就不能再使用該名稱來引用對象,並且如果該名稱是唯一引用該對象的引用,則已經泄露。


*請注意,一個對象可以有多個業主 - 任何其他物體retain的IT成爲部分所有者。