比方說,我有一個名爲「foo」的對象與另一個名爲「bar」的對象作爲屬性。Objective-C:你是否必須在釋放父對象之前釋放屬性對象?
當「foo」釋放時,它是否會自動刪除對「bar」的所有引用,以便「bar」也可以解除分配?或將「富」解除分配和「酒吧」浮在內存的某個地方?即使所有「酒吧」的引用都在「foo」中定義。
在此先感謝。
比方說,我有一個名爲「foo」的對象與另一個名爲「bar」的對象作爲屬性。Objective-C:你是否必須在釋放父對象之前釋放屬性對象?
當「foo」釋放時,它是否會自動刪除對「bar」的所有引用,以便「bar」也可以解除分配?或將「富」解除分配和「酒吧」浮在內存的某個地方?即使所有「酒吧」的引用都在「foo」中定義。
在此先感謝。
如果foo
對象有任何保留或(感謝大衛)bar
的副本,例如當你財產申報作爲兩者之一:
@property (nonatomic, retain) NSString *bar;
// Or
@property (nonatomic, copy) NSString *bar;
你需要釋放你bar
時取消分配foo
:
- (void)dealloc
{
[bar release];
[super dealloc];
}
會爲你不自由bar
的內存空間,直到您擺脫所有引用(即引用計數下降到0)的系統,所以你必須自己監視你的引用計數和對象。
如果你分配內存,你必須釋放它。所以,是的,在dealloc
中撥打[bar release]
或self.bar = nil
(如果您使用的是綜合屬性等)。
See here用於iOS上的內存管理介紹。
'bar = nil'不會削減它,您需要使用'self.bar = nil'或'[self setBar:無]'實際釋放目標對象。然而,在'-dealloc'中調用'self'的方法是個壞主意,所以請改爲調用'[bar release]'。 – 2010-07-15 15:14:41
對不起,你說得對,'self.bar = nil'。蘋果文檔和示例代碼通常會提供'self.prop = nil' ...但我基本同意。 – rfunduk 2010-07-15 15:16:17
對象A負責在釋放對其他對象(對象B,對象C等)的任何引用 - 這不會自動發生。
這是在對象上的-dealloc
方法完成:
- (void)dealloc
{
[propertyB release];
[propertyC release];
[super dealloc];
}
(或者如果屬性是讀/寫,並如maked retain
,可以替代[self setPropertyB:nil]
等)。
所以會發生的是,當對象A的所有引用都消失時,它將被釋放,從而減少屬性B和C的引用計數。如果這些對象僅由對象A擁有,它們也會結束結果被解除分配。 (這在你標記的所有iPhone OS開發中都是這樣,我假設你不是在談論Mac上的垃圾回收環境,它有不同的規則和行爲,並且會自動做一些事情。)
使用self.bar = nil
的主要原因是,如果bar是對在nib文件內創建的視圖的引用。在這種情況下,可以在-(void)viewDidUnload
中包含該行,因爲這會讓系統在視圖被洗出時釋放該對象。如果視圖返回,它將通過nib文件重新加載。但是,這並不能避免需要使用'self.bar = nil
或[bar release]
-(void) dealloc
+1如果該屬性聲明爲'copy',則還必須釋放+1。 – 2010-07-15 15:35:07