一句话概括KVO的底层原理
2020-10-13 本文已影响0人
云溪_Cloud
当给一个对象添加KVO
监听时,KVO
会在运行时(runtime
)自动创建一个新类,将isa指针指向这个新类,新类是原类的子类,命名规则是NSKVONotifying_xxx
的格式。新类内部也有一个set
方法,并且重写了class
和 dealloc
方法 ,_isKVOA
,之所以重写class
方法,是因为苹果不想将此新类暴露出来,并且不希望我们知道NSKVONotifying_xxx
内部实现,所以此时通过[xxx class]
查看类是看不到NSKVONotifying_xxx
的,必须通过object_getClass(xxx)
来查看,或者根据指针去查看。新类的set
方法内部调用了Foundation
的_NSSetXxxValueAndNotify
函数(此函数名取决于被改变对象的类型,可以根据方法地址打印查看得知),在_NSSetXxxValueAndNotify
内部顺序调用willChangeValueForKey:
,父类的set
方法,didChangeValueForKey:
,而在didChangeValueForKey:
内部又会调用监听器的observeValueForKeyPath:ofObject:change:context:
监听方法去告诉监听者属性值发生了变化,从而达到监听的目的。