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)
这里发生了什么?这是预期的行为吗?我找不到任何可以这样说的东西。
我不确定这是否记录在案,但这是预期的行为。
自动 KVO 通知通过在运行时悄悄地将实例的类从原始类更改ClassB为自动生成的子类来工作NSKVONotifying_ClassB,该子类覆盖所有必需的 setter 方法来为您执行这些willChange.../didChange...调用。通过调用 super,您可以有效地跳过所有这些魔法并调用原始的 setter,它只进行空值分配。
PS 这篇博文深入探讨了这一点:https : //www.mikeash.com/pyblog/friday-qa-2009-01-23.html
| 归档时间: |
|
| 查看次数: |
172 次 |
| 最近记录: |