使用超类'setter时未发送KVO通知

时间:2014-07-15 14:17:34

标签: objective-c key-value-observing kvc

我有一个定义属性的ClassA:

@interface ClassA : NSObject
@property (nonatomic) CGPoint property;
@end

实现不会覆盖访问者。

ClassB会覆盖setter来做一些额外的工作:

- (void)setProperty:(CGPoint)property {
    [super setProperty:property];
    [self someAdditionalWork];
}

在ClassB的另一种方法中,我尝试通过超级设置器设置此属性,以跳过其他工作:

- (void)otherMethodInClassB {
    // ...
    super.property = newValue;
    // ...
}

执行此操作时,不会发送该属性的KVO通知。如果我做同样的事情,但使用self,KVO通知按预期工作:

- (void)otherMethodInClassB {
    // ...
    self.property = newValue;
    // ...
}

这里发生了什么?这是预期的行为吗?我找不到任何可以这么说的东西。

1 个答案:

答案 0 :(得分:4)

我不确定这是否有记录,但这是预期的行为。

自动KVO通知的工作原理是在运行时将实例的类从原始ClassB静默更改为自动生成的子类NSKVONotifying_ClassB,它会覆盖所有必需的setter方法来执行这些{{1 } / willChange...要求你。通过调用super,你可以有效地跳过所有魔法并调用原始的setter,它只进行裸值赋值。

P.S。这篇博文详细介绍了这一点:https://www.mikeash.com/pyblog/friday-qa-2009-01-23.html