29 KVO底层实现

是基于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方法,让我们误以为还是使用的当前类,用来隐藏生成的派生类

你可能感兴趣的:(29 KVO底层实现)