如果在父对象的dealloc中释放子对象,为什么子对象对父对象的弱引用为零*

时间:2015-10-19 22:17:02

标签: objective-c cocoa reference weak-references

*因为孩子在父母的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

1 个答案:

答案 0 :(得分:1)

来自Apple的documentation on ARC

  

弱引用不会延长它指向的对象的生命周期,并且在没有对该对象的强引用时自动变为nil。

请注意,当取消分配对象时,它不会说""如果正在调用对象dealloc方法,则根据定义,所有强引用都已被删除。

此外,您不应该在已经解除分配的对象上调用方法。在取消分配对象之前,您应该找到一种取消注册观察者的方法。