KVO的本质是什么?
* 利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个子类
* 当修改instance对象的属性时,会调用Function的_NSSetXXXValueAndNotify方法
1.willChangeValueForKey:
2.父类的setter方法
3.didChangeValueForKey:
1)内部会触发监听器(observer)的监听方法(observerValueForKeyPath:ofObject:change:context:)
## KVC的赋值取值原理是什么?
* 常见的API
1. 赋值
1)- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
2) - (void)setValue:(id)value forKey:(NSString *)key;
2. 取值
1)- (id)valueForKeyPath:(NSString *)keyPath;
2)- (id)valueForKey:(NSString *)key;
* setValue:forKey:的原理
1. 先按照 setKey:、_setKey: 顺序查找方法
2. 如果找到了方法,传递参数,调用方法
3. 如果没有找到方法查看方法(accessInstanceVariablesDirectly)的返回值
1)返回NO,调用方法(setValue:forUndefinedKey:)并抛出异常(NSUnknownKeyException)
2)返回Yes,按照_key、_isKey、key、isKey顺序查找成员变量
① 找到成员变量直接赋值
② 未找到成员变量,调用方法(setValue:forUndefinedKey:)并抛出异常(NSUnknownKeyException)
* valueForKey: 的原理
1.先按照getKey、key、isKey、_key顺序查找方法
2.如果找到方法,调用方法
3. 如果没有找到方法查看(accessInstanceVariableDirectly)方法的返回值
1)返回NO, 调用方法(valueForUndefinedKey:),并抛出异常NSUnknownKeyException
2)返回Yes,按照_key、_isKey、key、isKey顺序查找成员变量
① 找到成员变量直接取值
② 未找到成员变量,调用(valueForUndefinedKey:)方法,并抛出异常NSUnknownKeyExcepyion