一、KVC的原理(赋值取值过程)
- KVC相关常用的API
- (void)setValue:(nullable id)value forKey:(NSString *)key;
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
- (nullable id)valueForKey:(NSString *)key;
- (nullable id)valueForKeyPath:(NSString *)keyPath;
@property (class, readonly) BOOL accessInstanceVariablesDirectly;
- KVC设置值的原理(setValue: forKey:的原理)
1、按照setKey:、_setKey的顺序查找方法,如果找到了方法,则传递参数调用方法
2、没找到方法,则查看accessInstanceVariablesDirectly的返回值,返回值为NO,则调用setValue:forUndefineKey:并抛出异常
3、返回值为YES(默认),按照_key、_isKey、key、isKey顺序查找成员变量,如果找到成员变量,直接赋值
4、没有找到成员变量则调用setValue:forUndefineKey:并抛出异常 - KVC取值的原理(valueForKey的原理)
1、按照getKey:、key、isKey、_key的顺序查找方法,如果找到了方法,则调用方法
2、没找到方法,则查看accessInstanceVariablesDirectly的返回值,如果返回值为NO,则调用setValue:forUndefineKey:并抛出异常
3、如果返回值为YES(默认),按照_key、_isKey、key、isKey顺序查找成员变量,如果找到成员变量,直接取值
4、没有找到成员变量则调用setValue:forUndefineKey:并抛出异常
二、通过KVC会触发KVO吗
会触发KVO
- 如果是调用了setter方法进行赋值的,会触发KVO。
- 如果是直接对成员变量进行赋值的,KVC内部会调用willChangeValueForKey:和 didChangeValueForKey:方法手动触发KVO。
网友评论