kvc、kvo

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: 方法

KVC

你可能感兴趣的:(kvc、kvo)