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: