2015-10-19 76 views
0

*,因爲孩子是在父對象的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]來看,弱引用MyViewControllernil 。即使這是MyViewController,首先叫close

這會導致問題,因爲觀察者未被正確移除,並且後來拋出異常,有時甚至崩潰。

它所看起來像,是保留計數到MyViewController已經在-dealloc之前遞減至0被調用,所以MyWindowController的弱引用時被設置爲nil。但是這對我沒有意義,因爲看起來保留計數會在-dealloc之後減少,並且即使不是這樣,弱參考是否會是nil

它可能會認爲這僅僅是一個奇怪的互動瓦特/ NSViewController擁有一個NSWindowController,但是,這並不讓我多大意義,無論是

爲什麼弱@property == nil

+1

嘗試推理保留計數總是很危險的。也就是說,保留計數永遠不會減少到零。當對一個保留數爲1的對象執行'-release'時,弱引用會被清除並被釋放。你說「在**'-dealloc'之後看起來保留計數會減少**」。在'-dealloc'之後沒有「。在'-dealloc'之後,沒有更多的對象具有保留計數。至於什麼時候關閉窗口,可以用'-viewWillDisappear'來代替。 –

回答

1

從蘋果公司的documentation on ARC

弱引用不會延長對象的生命週期它指向,並自動變爲零的時候有對象沒有強引用。

請注意,它不會說「何時解除分配對象」。如果正在調用對象dealloc方法,則根據定義,所有強引用都已被刪除。

此外,您不應該在已經釋放對象的對象上調用方法。在解除分配對象之前,您應該找到註銷觀察者的方法。

+0

總體感覺,謝謝。我不認爲我想從'MyWindowController'到'MyViewController'的強引用吧?那麼如果我在'MyViewController'中添加/刪除觀察者而不是'MyWindowController',會不會出現問題?這樣我可以在'MyViewController'的'-dealloc'中執行'[self removeObserver:self.myWindowController']',並且self不會是正確的? –