KVO是键值观察机制
当我们给一个属性添加kvo时,假设这个属性是A,这时会动态创建一个新的子类NSKVONotifying_A,重写了setter方法(class方法,dealloc方法),并且指向A的isa指针这时会指向NSKVONotifying_A
(注:重写class方法的愿意是为了隐藏对象真实类信息)
重写监听属性的setter方法,在setter方法内部会调用Foundation的_NSSetObjectValueAndNotify函数
_NSSetObjectValueAndNotify函数内部调用流程
1 首先会调用willChangeValueForKey
2 然后给监听属性赋值
3 最后调用didChangeValueForKey
4 最后调用 observer 的 observeValueForKeyPath去告诉监听器属性值发生了改变