2009-06-23 34 views

回答

4

我想說,每個班級管理自己的屬性。所以子類應該釋放它自己的屬性和基類版本。

一旦子類被釋放,它將不會訪問基類屬性,它在技術上不再存在。寫作的dealloc的標準方法是:

- (void)dealloc 
{ 
    // release my stuff, after this line 
    // I don't exist and do not need to access any of my properties 
    [super dealloc]; 
} 
+0

同意。無論語言如何,這都是OO編程中的規則。屬性是基於所有權的,比如Objective-C內存管理 - 兩者幾乎總是一樣的,因爲屬性本​​質上是一種訪問實例變量的好方法。總是在聲明它們的類中釋放ivars,而不是在它的任何子類中(如果有的話)。它基本上是匹配保留和釋放調用的模式。 – 2009-06-23 08:12:19

0

我對Objective-C很新,所以我也很好奇這裏的最佳答案。我認爲你應該在屬性合成的父類-dealloc中將屬性設置爲nil。如果由於某種原因將其保留在子類中,則還應該在子類中釋放它,但在超類中將該屬性設置爲nil不應有任何負面影響。

+0

Apple文檔不應該在init/dealloc中使用屬性設置器,所以您不應該將屬性設置爲零,而只需調用[ivar release]。如果您還需要將ivar設置爲零,那麼您應該糾正一些錯誤(例如,移除定時器/觀測值/經過調用的方法調用)。 – 2009-06-23 07:42:36

+0

很高興知道,謝謝。 – pix0r 2009-06-23 21:55:15

2

如果屬性僅用於子類,就應該在子類(而不是父類)中定義的子類應該釋放他們中它的 - (空)的dealloc功能。你會有這樣的事情:

- (void)dealloc 
{ 
    [username release]; 
    [password release]; 
    [super dealloc]; 
} 

請注意,我們不調用dealloc的屬性!我們只是稱之爲「發佈」,這意味着我們不再使用它們,系統可以清理它們(提供沒有人正在使用它們)。

0

在給定的塊中,保留,複製,alloc的調用次數應該通過調用release,autorelease來平衡。 如果你保留在子類中的東西,在子類中釋放它,並且如果在基類中...

我從文章中的內存中逐步解釋了這一點。

0

簡答:在基類中。

長答案:對象由其他對象「擁有」。要擁有一個對象,你必須分配或保留它(帶有retain,alloc,new或copy)。所有者負責以釋放或自動釋放方式處理內存。每個分配/保留應該有一個釋放/自動釋放。

這是可可約定,只有以「new」和「copy」開頭的方法返回已被分配/複製/保留但不屬於方法接收者的對象。那麼所有者就是稱爲「新」或「複製」功能的對象。