1. 在添加监听后 [publishObj addObserver:receiveObj forKeyPath:@"userName" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:nil];
利用RuntimeAPI会动态生成一个子类假设原来的类名是 Person,那么新生成的子类是 NSKVONotifying_Person。并且让这个instance对象的isa指向这个子类。
我们遍历这个子类的属性以及方法可以看到如下结果:
可以看到新的子类没有新添加的属性,只有方法。最明显的一个方法是重写了setUserName: 这个方法。那我们就有理由怀疑发布实际上是在这个方法里实现的。通过手动调用KVO,我们得出结论确实如此。实际上是通过:
[self willChangeValueForKey:@"userName"];
[self didChangeValueForKey:@"userName"];
来实现的。
综上所述:KVO在调用的时候,实际上生成了NSKVONotifying_Person的新类,实例的isa指针指向这个新类。该类的父类实际上还是Person,新类重写了四个方法,监听是通过setter方法来实现的,这点可以通过手动调用KVO来证实,最后回调结果。
网友评论