![](/img/trans.png)
[英]Objective-C object dealloc'd while other objects still has a delegate reference to it causes crashes. How to prevent this?
[英]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];
}
(或者如果屬性是讀/寫並且retain
為retain
,則可以替換[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.