美文网首页
KVO实现原理

KVO实现原理

作者: 153037c65b0c | 来源:发表于2018-04-24 16:11 被阅读17次

    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

    相关文章

      网友评论

          本文标题:KVO实现原理

          本文链接:https://www.haomeiwen.com/subject/rjodlftx.html