0

我有一个定义属性的 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;
    // ...
}

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

4

1 回答 1

5

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

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

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

于 2014-07-15T14:26:02.200 回答