是基于runtime运行时机制来实现的
a 当某个类的对象第一次被观察的时候,系统会在运行期间动态的创建该类的一个派生类,在这个派生类中重写基类任何被观察属性的setter方法,派生类在被重写的setter方法中实现真正的通知机制
b 如果原类为Person,那么生成的派生类名为NSKVONotifying_Person
c 每一个类中都有一个isa指针指向当前类,所以当一个类的对象第一次被观察的时候,系统就会偷偷将isa指针指向动态生成的派生类,从而在被监听属性赋值的时候被执行的派生类的setter方法
d键值观察通知依赖于NSObjectd的两个方法,wilChangeValueForKey:和didChangeValueForKey: 在一个被观察属性发生改变之前,willChavalueforkey一定会被调用,这就会记录旧值;而当改变之后,didChangeValueForKey会被调用,observeValueForKey:ofObject:change:context也会被调用
手动触发一个value的kvo:在注册KVO之前设置一个初始值,注册之后,设置一个不一样的值,就可以触发了
@property(nonatomic,strong)NSDate *now;
self willChangeValueForKey:@"now"];
self didChangeValueForKey:@"now"];
e KVO这套实现机制中,系统偷偷重写了class方法,让我们误以为还是使用的当前类,用来隐藏生成的派生类