KVO
观察者模式,使用了isa 混写来实现kvo。
观察对象A,将A的isa指针指向A的子类,NSKVONotifying_A,重写setter 方法
重写setter 方法负责通知所有观察对象
//NSKVONotifying_A 的setter 实现
- (void)setValue:(id)obj
{
[self willChangeValueForKey:@"keyPath"];
//调用父类实现,也即原类的实现
[super setValue:obj];
[self didChangeValueForKey:@"keyPath"];
}
其中 [super setValue:obj]; 这句解决了你对子类发送消息,为啥父类的值也会更新的原因。
对成员变量赋值,不会触发KVO, 因为不会触发setter 方法。
需要手动设置 willChangeValueForKey: 方法和 didChangeValueForKey: 方法