KVO
本质
在修改对象属性调用set
方法的时候会利用Runtime
API动态生成该对象的子类,并且让该对象的isa
指针会指向这个全新的子类的类对象,拿 Person
对象举例,生成的子类为NSKVONotifying_Person
,同时会调用类对象中Foundation
的_NSSetXXXValueAndNotify
函数,里面具体会实现三个方法willChangeValueForKey
,父类原来的setter
方法,didChangeValueForKey
内部会触发监听器(Observe
)的监听方法(observeValueForKeyPath:ofObject:change:context:
)
如何手动触发KVO
手动调用willChangeValueForKey
,didChangeValueForKey
直接修改成员变量会触发KVO
么
修改成员变量不会触发KVO
,只有修改对象的属性或者用kvc
才会。