2010-09-09 56 views
2

如果我創建一個視圖,並將其添加爲子視圖並將其添加到數組中,是否必須將其釋放兩次?目標C(iphone)關於發佈的問題

UIView* cat = [[UIView alloc] initWithFrame:someFrame]; 
    [self.view addSubview:cat]; 
    [self.animals addObject:cat]; 
    [cat release]; 
    [cat release]; 

對我來說,看起來有點奇怪,我有2個發佈聲明,我還沒有看到有人這麼做。但在這種情況下,保留數不會增加2嗎?

回答

8

您應該只有一個release - 以平衡allocaddSubView:addObject:都沒有給予對象所有權,因此呼叫者不需要將它們與release平衡。閱讀memory management guide應該爲你清除所有這些。

這可能有助於記住「緝毒特警」 - 如果你調用一個對象,包括詞「ñ EW」的方法,「一個 LLOC」,「[R Etain的」或「Ç opy「,你需要釋放它。正如你在上面的代碼中看到的那樣,只有alloc符合該法案。既然你只有一次NARCED,你只需要釋放一次。

+0

謝謝,我會記住的。 – sol 2010-09-09 01:00:03

2

當貓被添加到self.view,然後self.view擁有貓,它負責釋放貓。它和self.animals一樣。 self.animals擁有這隻貓。當self.animals被釋放時,它將釋放它擁有的所有對象。

所以,你應該只放一隻貓。因爲在你的代碼塊中,你只擁有一隻貓,而不是兩隻。

+0

確定後續問題 - 然後self.animals =零釋放貓? – sol 2010-09-09 00:57:29

+0

我假設你的動物是NSArray的結構。當動物數組被釋放時,數組內的所有對象都將收到釋放消息。所以,動物中的貓會被釋放。 – AechoLiu 2010-09-09 05:07:01

3

除了什麼查克寫道:

不是你釋放,因爲addSubview:addObject:可能/可能不會增加保留計數。

這是完全錯誤的方式來看待它。如果您的對象是self.viewretain,那麼self.view有責任正確釋放它,這不是您應該關心的。

這是,因爲您創建了對象alloc您需要釋放它。

0

如前所述,您不必將其釋放兩次;一次是所有需要的。但是,如果您使用autorelease,則不必釋放它:

UIView* cat = [[[UIView alloc] initWithFrame:someFrame] autorelease]; 
[self.view addSubview:cat]; 
[self.animals addObject:cat]; 

cat對象將在RunLoop循環結束時釋放。使用autorelease將使您的代碼更清晰,更能夠應對更改。

另外你不需要視圖和動物的自我限定符,除非你想區分它們與本地作用域對象(它也是一個很差的做法,有局部作用域變量名稱與你的類成員相同)。