我有一个定义属性的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;
// ...
}
这里发生了什么?这是预期的行为吗?我找不到任何可以这么说的东西。
答案 0 :(得分:4)
我不确定这是否有记录,但这是预期的行为。
自动KVO通知的工作原理是在运行时将实例的类从原始ClassB
静默更改为自动生成的子类NSKVONotifying_ClassB
,它会覆盖所有必需的setter方法来执行这些{{1 } / willChange...
要求你。通过调用super,你可以有效地跳过所有魔法并调用原始的setter,它只进行裸值赋值。
P.S。这篇博文详细介绍了这一点:https://www.mikeash.com/pyblog/friday-qa-2009-01-23.html