当咱们对A类添加监听的时候,系统会自动生成一个NSKVONotifying_A的子类,这个类重写了A的class、superclass、deealloc方法和该属性的Set方法,同时A类的对象的isa指针指向了该虚拟子类。当监听属性改变的时候系统调用NSSetobjectValueandNotify,这个方法的执行流程是(willchangeValueforkey->改变父类的值->didchangeValueforkey->observeValueForKey:ofObject:change:context:),若是设置automaticallyNotifiesObserversForKey:(NSString *)key为NO的时候则须要手动触发KVO即手动调用willchangeValueforkey和didchangeValueforkey.html
func _NSSetObjectValueAndNotify {
...
willchangeValueforkey
...
" objc_msgSendSupper '改变父类的值(猜想这样实现) "
...
didchangeValueforkey
...
observeValueForKey:ofObject:change:context:
}
复制代码
由于该子类为系统自动生成苹果想假装成并无这个类 因此重写class/superclass ,可是调用 objc_getClass()这个方法时候依然会暴露,由于这个方法是调用调用对象的isa指针指向。dealloc则是系统还有一些其余的事情处理数组
KVCKVC是由NSKeyValueCoding非正式协议实现的一种机制,对象采用该协议来提供对其属性的间接访问。当一个对象符合键值编码时,它的属性能够经过一个简洁、统一的消息传递接口经过字符串参数来寻址。这种间接访问机制补充了实例变量及其关联的访问方法所提供的直接访问。bash
set value:for key:的默认实现:给定key和value参数做为输入,尝试在接收调用的对象内,使用如下过程将名为key的属性设置为value(对于非对象属性,则设置未包装的value版本,如表示非对象值:app