簡體   English   中英

Objective-C:在釋放父對象之前,是否必須dealloc屬性對象?

[英]Objective-C: Do you have to dealloc property objects before deallocating the parent object?

假設我有一個名為“foo”的對象,另一個名為“bar”的對象作為屬性。

當“foo”解除分配時,它會自動刪除對“bar”的所有引用,以便“bar”也可以解除分配嗎? 或者“foo”deallocate和“bar”漂浮在某個地方的記憶中? 即使所有“bar”的引用都在“foo”中定義。

提前致謝。

如果foo對象有任何保留或(感謝Dave) bar副本,例如當您將屬性聲明為以下任何一個時:

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

當你釋放foo時,你需要釋放bar

- (void)dealloc
{
    [bar release];

    [super dealloc];
}

系統不會釋放任何bar的存儲空間,直到你擺脫對它的所有引用(即引用計數降至0),因此你必須自己監視引用計數和對象。

如果你分配內存,你必須釋放它。 所以,是的,在你的dealloc調用[bar release]self.bar = nil (如果你正在使用合成屬性和所有這些)。

請參閱此處了解iOS上的內存管理簡介。

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

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

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

(或者如果屬性是讀/寫並且retainretain ,則可以替換[self setPropertyB:nil]等)。

因此,當對對象A的所有引用都消失時,它將被釋放,從而減少屬性B和C上的引用計數。如果這些對象僅由對象A擁有,它們也將最終被釋放為結果。

(對於您標記的所有iPhone OS開發都是如此。我假設您不是在談論Mac上的垃圾收集環境,它具有不同的規則和行為,並且會自動執行某些操作。)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM