1.当某个类的对象第一次被观察后,系统会通过Runtime动态的创建一个派生类,继承原始类,如原始类为Member,则派生类为NSKVONotify_Member.
在添加观察之前派生类为NSKVONotify_Member的isa指针指向了原始类Member。实际上是重写了class方法来runtime该对象是属于那个类。
2.派生类为NSKVONotify_Member重写原始类的四个方法
setter 用于通知观察者值已经发生改变,会调用Foundation C函数_NSSet***ValueAndNotify()
-
willChangeValueForKey:
-
调用父类的setter方法
-
didChangeValueForKey:
-
内部触发监听器监听方法:observeValueForKeyPath: ofObject: change: context:
class 返回值为原始类,隐藏NSKVONotify_Member内部实现 return class_getSuperclass(object_getClass(self))
_isKVOA 私有方法_isKVOA 是用来标示该类是一个KVO 机制声称的类
dealloc 处理一些释放内存工作
下面是具体的代码分析:





如何手动触发KVO?
- willChangeValueForKey:
- didChangeValueForKey:
本文详细解析了KVO(Key-Value Observing)机制的工作原理,包括系统如何通过Runtime动态创建派生类来监听对象的变化,以及如何重写setter等方法以实现值变更的通知。通过具体代码分析,读者将理解KVO机制的内部实现。

6620

被折叠的 条评论
为什么被折叠?



