*,因爲孩子是在父對象的dealloc
內釋放的,這並不意味着父對象仍然存在,並且孩子對父母的弱引用仍然有效?如果在父對象的dealloc中釋放子對象,爲什麼子對象對父對象的弱引用是零*
我有一個父對象,NSViewController
子類,它擁有另一個對象,NSWindowController
子類。
@interface MyViewController : NSViewController
@property (strong) MyWindowController *myWindowController;
的NSWindowController
子類有弱引用回NSViewController
@interface MyWindowController : NSWindowController
@property (weak) MyViewController *myViewController;
裏面的MyViewController
,我已重寫-dealloc
:
-(void)dealloc
{
[self.myWindowController close];
self.myWindowController = nil;
}
和MyWindowController
裏面,我加入/刪除觀察員內部的init
/close
我thods。
//INIT:
[self.myViewController addObserver:self forKeyPath:NSStringFromSelector(@selector(selectedObjects)) options:kObservingOptions context:nil];
//CLOSE:
[self.myViewController removeObserver:self forKeyPath:NSStringFromSelector(@selector(selectedObjects))];
現在,這裏是令人困惑的部分。
上釋放的操作順序是這樣的:
-[MyViewController dealloc]
-[MyWindowController close]
-[MyViewController removeObserver:MyWindowController]
,但在-[MyWindowController close]
來看,弱引用MyViewController
是nil
。即使這是MyViewController
,首先叫close
。
這會導致問題,因爲觀察者未被正確移除,並且後來拋出異常,有時甚至崩潰。
它所看起來像,是保留計數到MyViewController
已經在-dealloc
之前遞減至0被調用,所以MyWindowController
的弱引用時被設置爲nil
。但是這對我沒有意義,因爲看起來保留計數會在-dealloc
之後減少,並且即使不是這樣,弱參考是否會是nil
?
它可能會認爲這僅僅是一個奇怪的互動瓦特/ NSViewController
擁有一個NSWindowController
,但是,這並不讓我多大意義,無論是
爲什麼弱@property
== nil
?
嘗試推理保留計數總是很危險的。也就是說,保留計數永遠不會減少到零。當對一個保留數爲1的對象執行'-release'時,弱引用會被清除並被釋放。你說「在**'-dealloc'之後看起來保留計數會減少**」。在'-dealloc'之後沒有「。在'-dealloc'之後,沒有更多的對象具有保留計數。至於什麼時候關閉窗口,可以用'-viewWillDisappear'來代替。 –