当给一个对象添加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:
监听方法去告诉监听者属性值发生了变化,从而达到监听的目的。
一句话概括KVO的底层原理
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...