美文网首页
Objective-C 语言特性之KVO

Objective-C 语言特性之KVO

作者: 锋尚达人 | 来源:发表于2021-03-19 12:18 被阅读0次

         对于KVO的基本使用这里不再做阐述,使用时,记得添加监听和移除监听成对出现,并在合适的时机再将监听移除即可。这里主要对KVO的底层实现做简单阐述。

    (1)KVO 实现原理

        KVO的底层实现其实是利用RuntimeAPI 动态生成一个子类,并且让instance对象的isa 指向这个全新的子类。并且重写了这个子类的添加了监听的属性的setter 方法。  这样当修改instance对象的监听属性时,就会通过isa指针,指向新的子类,并调用子类的setter方法。在子类的setter方法中,调用了_NSSetXXXValueAndNotify 函数, 该函数实现了如下逻辑:

    (1) willChangeValueForKey()函数

    (2)调用父类原来的setter方法

    (3)添加didChangeValueForKey()函数。

    (2)KVO 实际应用流程:

            当我们给对象注册一个观察者添加了KVO监听时,系统会修改这个对象的isa指针指向。在运行时,动态创建一个新的子类,NSKVONotifying_A类,将A的isa指针指向这个子类,来重写原来类的set方法;set方法实现内部会顺序调用willChangeValueForKey方法、原来的setter方法实现、didChangeValueForKey方法,而didChangeValueForKey方法内部又会调用监听器的observeValueForKeyPath:ofObject:change:context:监听方法。  引用—木子雨廷t。

    (3)如何手动触发KVO ?

    手动调用willChangeValueForKey:和didChangeValueForKey;

    (4)直接修改成员变量会触发KVO吗?

    不会触发KVO,因为没有调用setter方法。就不会无法触发对应的机制,完成监听。

    (5)使用kvc 能够触发KVO 吗?

            能够触发,KVO 的实现是建立在KVC的基础上的,KVC底层添加了对KVO属性的监听。KVC的getter 方法和setter 方法与一般意义的属性和成员变量方式都是不一样的。具体参考KVC原理。

    (6)kvo使用的设计模式:

             在观察者模式中有两种对象,一个是发布对象,一个是订阅对象。在kvo的使用过程中, 添加了某个对象的kvo的控制器实际上即是发布者,也是订阅对象。首先,控制器通过修改属性值,实现了订阅属性的变更,即发布,所以为发布对象。其次控制器实现了observeValueForKeyPath:ofObject:change:context: 的监听方法,即实现了观察者对发布者发布内容的订阅,所以是订阅对象。

            另外,Objective-C 中通知的使用也是使用了观察者模式。nsnotifyCenter为发布者,添加了通知的控制器为订阅对象,即观察者。

    相关文章

      网友评论

          本文标题:Objective-C 语言特性之KVO

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