5

比方說,我有一個名爲「foo」的對象與另一個名爲「bar」的對象作爲屬性。Objective-C:你是否必須在釋放父對象之前釋放屬性對象?

當「foo」釋放時,它是否會自動刪除對「bar」的所有引用,以便「bar」也可以解除分配?或將「富」解除分配和「酒吧」浮在內存的某個地方?即使所有「酒吧」的引用都在「foo」中定義。

在此先感謝。

回答

15

如果foo對象有任何保留或(感謝大衛)bar的副本,例如當你財產申報作爲兩者之一:

@property (nonatomic, retain) NSString *bar; 
// Or 
@property (nonatomic, copy) NSString *bar; 

你需要釋放你bar時取消分配foo

- (void)dealloc 
{ 
    [bar release]; 

    [super dealloc]; 
} 

會爲你不自由bar的內存空間,直到您擺脫所有引用(即引用計數下降到0)的系統,所以你必須自己監視你的引用計數和對象。

+2

+1如果該屬性聲明爲'copy',則還必須釋放+1。 – 2010-07-15 15:35:07

2

如果你分配內存,你必須釋放它。所以,是的,在dealloc中撥打[bar release]self.bar = nil(如果您使用的是綜合屬性等)。

See here用於iOS上的內存管理介紹。

+1

'bar = nil'不會削減它,您需要使用'self.bar = nil'或'[self setBar:無]'實際釋放目標對象。然而,在'-dealloc'中調用'self'的方法是個壞主意,所以請改爲調用'[bar release]'。 – 2010-07-15 15:14:41

+0

對不起,你說得對,'self.bar = nil'。蘋果文檔和示例代碼通常會提供'self.prop = nil' ...但我基本同意。 – rfunduk 2010-07-15 15:16:17

0

對象A負責在釋放對其他對象(對象B,對象C等)的任何引用 - 這不會自動發生。

這是在對象上的-dealloc方法完成:

- (void)dealloc 
{ 
    [propertyB release]; 
    [propertyC release]; 
    [super dealloc]; 
} 

(或者如果屬性是讀/寫,並如maked retain,可以替代[self setPropertyB:nil]等)。

所以會發生的是,當對象A的所有引用都消失時,它將被釋放,從而減少屬性B和C的引用計數。如果這些對象僅由對象A擁有,它們也會結束結果被解除分配。 (這在你標記的所有iPhone OS開發中都是這樣,我假設你不是在談論Mac上的垃圾回收環境,它有不同的規則和行爲,並且會自動做一些事情。)

0

使用self.bar = nil的主要原因是,如果bar是對在nib文件內創建的視圖的引用。在這種情況下,可以在-(void)viewDidUnload中包含該行,因爲這會讓系統在視圖被洗出時釋放該對象。如果視圖返回,它將通過nib文件重新加載。但是,這並不能避免需要使用'self.bar = nil[bar release]-(void) dealloc