iOS KVO原理

2019-07-09  本文已影响0人  zhongli_007

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来证实,最后回调结果。

上一篇 下一篇

猜你喜欢

热点阅读