目标c中dealloc的执行顺序

时间:2014-12-11 00:37:58

标签: objective-c

我有一个属性为MemberClass的类。在setup方法中,我为MemberClass分配和addObserver。

@interface ParentClass()
    MemberClass *_member;
@end

@implementation ParentClass

-(void)dealloc
{
   if (_member)
   {   [_member removeObserver:self forKeyPath:@"key" context:nil];
        _member = nil;
   }
}

-(void)setup
{
   _member = [[MemberClass alloc] init];
   [_member addObserver:self forKeyPath:@"key" option:NSKeyValueObservingOptionNew context:context];
}
@end

我的问题是ParentClass的dealloc()总是在调用MemberClass的dealloc()之前调用吗?何时会召集MemberClass的dealloc()?

更新: 我得到一个例外 "类会员类被解除分配,而关键价值观察者仍在其注册"。从代码中,我不知道这是怎么可能的。由于ParentClass总是在dealloc()中删除Observer。

2 个答案:

答案 0 :(得分:1)

当没有对实例的更多引用时,_member引用的实例将被释放。

如果MemberClass实例仅由关联的ParentClass实例保留,那么在编写代码时,ParentClass dealloc将在{{1}之前调用调用} MemberClass

这假设在调用dealloc时,对ParentClass dealloc实例的唯一引用是MemberClass被释放的实例。

你在做什么似乎是正确的。您的ParentClass代码正在正确管理ParentClass实例并正确清理观察者。

不需要拨打MemberClass

答案 1 :(得分:0)

当对象不再有强引用时,将释放该对象。

ParentClass实例强烈引用_member

因此,ParentClass的{​​{1}}方法将永远在dealloc的{​​{1}}方法之前调用MemberClass dealloc方法。

在取消分配父类之前,

_member将不会被释放,直到ParentClass的{​​{1}}方法返回后才会发生。