KVO实现原理

2018-04-24  本文已影响17人  153037c65b0c

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的实现了。

参考:isa-swizzling

上一篇下一篇

猜你喜欢

热点阅读