美文网首页
KVO基本原理

KVO基本原理

作者: uproject | 来源:发表于2016-10-19 20:27 被阅读66次

    当观察某对象A的时候,KVO机制动态创建一个对象A当前类的子类,并未这个新的子类重写了被观察属性keyPath的setter方法,setter方法随后负责通知观察对象属性的改变状况

    剖析

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

    • NSKVONotifying_A类的剖析

    在这个过程,被观察对象的isa指针从指向原来的A类,被KVO机制修改为指向系统新创建的子类NSKVONotifying_A类,来实现当前类属性值改变的监听;
    所以当我们从应用层面上看来,完全没有意识到有新的类出现,这是系统“隐瞒”了对KVO的底层实现过程,让我们误以为还是原来的类。但是此时如果我们创建一个新的名为“NSKVONotifying_A”的类(),就会发现系统运行到注册KVO的那段代码时程序就崩溃,因为系统在注册监听的时候动态创建了名为NSKVONotifying_A的中间类,并指向这个中间类了。

    • 子类setter方法剖析

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

    原文链接:http://www.jianshu.com/p/e59bb8f59302

    相关文章

      网友评论

          本文标题:KVO基本原理

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