我有一个属性为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。
答案 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}}方法返回后才会发生。