2015-10-19 82 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不会是正确的? –