iOS开发之深入剖析KVO实现原理
2016-07-20 本文已影响171人
1c7d21358574
导语
众所周知,KVO是OC中一种重要的机制,用来监听某个对象属性值的改变,从而方便我们做一些实时的更新操作。下面结合代码断点来分析下KVO的实现原理,解开KVO看似神秘的面纱。
我们知道,OC是一门动态语言,这门语言的核心就是runtime机制,而KVO正是基于runtime实现的(这里不对runtime多加赘述,网上大把的资料),上代码分析实现过程。


我们可以看到,在被监听前后,监听对象的isa指针指向的类放生了改变,在添加监听者之后,指向了一个NSKVONOtifying_ZYAssist的类,那么这个类是如何产生的呢?关键来了,runtime出马了,当开始监听某个对象后,runtime会创建一个新的类NSKVONOtifying_xxx,该类继承自原先的class。在这个新的派生类中,它重写了所有被观察属性的setter方法,一旦属性值有改变,会发送通知给监听者,进而监听者将监听对象属性值的变化过程以
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
方法展示出来,然后将对象的isa指针指向新创建的NSKVONOtifying_xxx,这就是KVO实现的原理。
runtime机制的强大,毋庸置疑,我目前接触到的只是冰山一角,还有很多点值得去发掘,runtime虽然在平时开发中使用比重不是那么高,但还是值得每个iOS程序员去下功夫研究。额,说多了,匿了(⊙o⊙)…