*,因为孩子是在父对象的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'来代替。 –