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

Jaw*_*wap 0 objective-c key-value-observing kvc

我有一个定义属性的 ClassA:

@interface ClassA : NSObject
@property (nonatomic) CGPoint property;
@end
Run Code Online (Sandbox Code Playgroud)

该实现不会覆盖访问器。

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

- (void)setProperty:(CGPoint)property {
    [super setProperty:property];
    [self someAdditionalWork];
}
Run Code Online (Sandbox Code Playgroud)

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

- (void)otherMethodInClassB {
    // ...
    super.property = newValue;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

- (void)otherMethodInClassB {
    // ...
    self.property = newValue;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

ham*_*ene 5

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

自动 KVO 通知通过在运行时悄悄地将实例的类从原始类更改ClassB为自动生成的子类来工作NSKVONotifying_ClassB,该子类覆盖所有必需的 setter 方法来为您执行这些willChange.../didChange...调用。通过调用 super,您可以有效地跳过所有这些魔法并调用原始的 setter,它只进行空值分配。

PS 这篇博文深入探讨了这一点:https : //www.mikeash.com/pyblog/friday-qa-2009-01-23.html