*因为孩子在父母的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
方法中添加/删除观察者。
//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
&# 39;对它的弱引用设置为nil
。但这对我来说没有意义,因为看起来保留计数会在 -dealloc
之后减少,即使情况不是这样,也会弱引用为nil
?
这可能只是一个奇怪的互动w / NSViewController
拥有NSWindowController
,但这对我来说没有多大意义
为什么弱@property
== nil
?
答案 0 :(得分:1)
来自Apple的documentation on ARC:
弱引用不会延长它指向的对象的生命周期,并且在没有对该对象的强引用时自动变为nil。
请注意,当取消分配对象时,它不会说""如果正在调用对象dealloc
方法,则根据定义,所有强引用都已被删除。
此外,您不应该在已经解除分配的对象上调用方法。在取消分配对象之前,您应该找到一种取消注册观察者的方法。