对于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为发布者,添加了通知的控制器为订阅对象,即观察者。
网友评论