2010-10-12 103 views
0

我想澄清一些事情:內存管理問題

即時我添加一個UIVIEW即另一個UIVIEW編程。

[theview addsubview:thechildview];

我需要因爲theview遞增保留計數釋放thechildview。

對不對?

所以基本上,如果我有一個循環,我使用的環路初始化子視圖和子視圖添加到視圖:

for(int i=0;i<10;i++){ 

    UIView *child = [UIview alloc]init..... 
    [parent addSubview:child]; 
    [child release]; 
} 

我仍然需要釋放孩子吧?那麼這將意味着子視圖仍然有1個保留計數?

事情是每當我添加後調用孩子的發佈,孩子在一段時間後被釋放。

你們可以確認我是否通過在添加後釋放孩子來做正確的事情嗎?

謝謝。

回答

3

你應該在某個地方釋放它,正確。你可以堅持下去,稍後再發布,但是你有責任在一些時候做。

父視圖將自行保留/釋放其孩子。所以如果父視圖得到釋放,它將釋放其子視圖。

如果子視圖從其超級視圖中刪除,它也將被釋放。

+0

感謝您的確認。 – user281300 2010-10-12 12:39:18

2

我需要釋放theChildview,因爲視圖遞增保留計數。

錯誤。

如果你擁有它,並且你已經完成了使用,你需要釋放ChildView。視圖是否選擇保留是完全不相關的。

因此,如果我們看一下你的循環

for(int i=0;i<10;i++){ 

    UIView *child = [UIview alloc]init..... 
    [parent addSubview:child]; 
    [child release]; 
} 

的代碼是正確的,因爲在循環塊的開頭你alloc這意味着子,你擁有它,並在循環結束它即將超出範圍,這意味着你不再需要它,所以你必須釋放(或autorelease)它。

什麼之間發生在完全無關,你應該承擔什麼其他對象上任何特定的方法做(除了它附着在Memory Management Rules)任何東西。

我還是需要釋放孩子吧?那麼這將意味着子視圖仍然有1個保留計數?

你不能假定任何關於保留計數。 parent可能會導致對象被保留多次,如果它將它交給其他對象。它可能選擇複製它而不是保留它。如果它不需要保留參考,它可能根本不會保留它。

你們可以通過發佈孩子確認我做了正確的事嗎?

不,你正在做的正確的事情,通過釋放它,當你完成使用它。

+0

葉依賴於保留數不是要走的路。如果我要在同一個班級的其他地方使用這些孩子的視圖,我可能不需要現在釋放它。 – user281300 2010-10-15 11:42:13