美文网首页
知识集锦

知识集锦

作者: DDY | 来源:发表于2016-11-12 16:08 被阅读65次

    https://github.com/starainDou 欢迎点星

    Mask.png

    KVO实现原理

    • KVO基本原理:

    1 kvo是基于runtime机制实现的
    2 当某个类的属性对象第一次被观察时,系统就会在运行期动态的创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法,派生类在被重写的setter方法内实现真正的通知机制
    3 如果原类为Person,那么生成的派生类名为NSKVONotifying_Person
    4 每个类对象中都有一个isa指针指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的派生类的setter方法
    5 键值观察通知依赖于NSObject的两个方法:willChangeValueForKey:和didChangeValueForKey:在一个被观察属性发生改变之前,willChangeValueForKey:会被调用,这就会记录旧的值,而当改变发生后,didChangeValueForKey:会被调用,继而observeValueForKey:ofObject:change:context: 也会被调用。

    • KVO深入原理:

    1 Apple使用了isa混写(isa-swizzling)来实现KVO,当观察对象A时,KVO机制动态创建一个新的名为:NSKVONotifying_A的新类,该类继承自对象A的本类,且KVO为NSKVONotifying_A重写观察属性的setter方法,setter方法会负责在调用原setter方法之前和之后,通知所有观察对象属性值的更改情况。

    2 NSKVONotifying_A类剖析:在这个过程,被观察对象的isa指针从只想原来的A类,被KVO机制修改为指向系统新创建的自雷NSKVONotifying_A类,来实现当前类属性值改变的监听。

    3 所以当我们从应用层面上来看,完全没有意识到有新的类的出现,这是系统“隐藏”了对KVO的底层实现过程,让我们误以为还是原来的类。但是此时如果我们创建一个新的名为NSKVONotifying_A的类,就会发现系统运行到注册KVO的那段代码时程序就崩溃,因为系统在注册监听的时候动态创建了名为NSKVONotifying_A的中间类,并指向这个中间类了。

    4(isa指针的作用:每个对象都有isa指针,指向该对象的类,它告诉Runtime系统这个对象的类是什么。所以对象注册为观察者时,isa指针指向新子类,那么这个被观察的对象就神奇的变成新子类的对象(或实例)了)因而在该对象上对setter的调用就会调用已重写的setter,从而激活键值通知机制。

    5 子类setter方法剖析:KVO的键值观察通知依赖于NSObject的两个方法:willChangeValueForKey:和didChangeValueForKey:,在存取数值的齐纳后分别调用2个方法,被观察属性发生改变之前,willChangeValueForKey:被调用,通知系统该keyPath的属性值即将变更,当改变发生后,didChangeValueForKey:被调用,通知系统该keyPath的属性值已经变更,之后observeValueForKey:ofObject:change:context: 也会被调用,且重写观察属性的setter方法这种集成法师的注入实在运行时而不是在编译时实现的。

    iOS中block和delegate的区别(面试必问) https://blog.csdn.net/u010670946/article/details/71340711
    https://blog.csdn.net/jie863230900/article/details/45021541

    相关文章

      网友评论

          本文标题:知识集锦

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