KVO实现原理
KVO是基于runtime机制实现的,使用了isa-swizzling技术(isa替换)
下面是一个例子用来证明在添加KVO之后的变化
创建一个Person类,添加两个属性age和name,添加一个方法打印信息- (void)printInfo。
分别在添加KVO前,添加后,移除后打印信息
打印信息如下
观察这些打印得到的信息有:
1.在添加KVO后Person类变成Person的子类NSKVONotifying_Person。
2.添加KVO观察的属性age的setter方法在添加后函数指针发生改变,其他属性和方法在添加前,后,以及删除后不变。
由此可以得出结论:
1.KVO是基于runtime机制实现的,使用了isa-swizzling技术。
2.添加Observer时,会通过runtime实现一个继承该类的子类,子类名为NSKVONotifying_+父类类名,将之前父类的isa指针指向了这个子类,重写了被观察的对象setter方法,并且在重写中添加了willChangeValueForKey:(被观察属性发生改变之前)以及didChangeValueForKey:(被观察属性发生改变之后),从而激活键值通知机制。
3.在移除observer时,又将isa指向原来的类对象中。
然后我们在分析一下, 在真正调用的setAge:的情况下, 根据消息机制我们知道它先通过isa找到对应对象的类, 也就是现在NSKVONotifying_Person, 然后再去找setAge:,由于NSKVONotifying_Person这个对象重写了这个方法, 那么就会直接取当前的实现, 也就是带有willChangeValueForKey:以及didChangeValueForKey:, 那么自然就实现了对KVO的实现了。