KVC的常见API
- (void)setValue:(nullable id)value forKey:(NSString *)key;
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
- (id)valueForKey:(NSString *)key;
- (nullable id)valueForKeyPath:(NSString *)keyPath;
通过KVC修改属性会触发KVO吗?
可以。
原理如下图:

过程描述:
1、kvc会自动寻找setKey方法,如果没有找到setKey方法,会寻找_setKey:方法。
2、自定义_setKey:方法,kvc也可以正常执行
3、如果上面的两个方法都没找到,查看 accessInstanceVariableDirectly方法,如果该方法返回no,直接抛出“setValue:forUndefinedKey:”异常
4、如果返回yes,则放直接访问实例变量_key、_isKey、key、iskey。并严格按照这个顺序查找实例变量。
5、只要存在上述的实例变量,没有属性,kvc一样可以执行并可以调用kvo成功。也就是说:只要kvc能够执行,kvo一定能够响应。
没有声明属性的kvc内部伪代码:
willChangeValueForKey:
_name = @"xiayu"
didChangeValueForKey
什么是属性:
属性是一种语法糖,声明属性就自动生成了set和get方法,对实例变量进行存取操作。
KVC的取值和赋值过程是什么?原理是什么?

过程描述:
kvc在取值的时候会按照 getKey、key、isKey、_key的方法的顺序查找返回值,如果这四个方法都不存在,则询问accessInstanceVariableDirectly,如果方法返回No,则直接跑出异常,如果返回yes,则查找按照_key、_isKey、key、isKey的顺序查找实例变量。如果实例变量都不存在,则直接跑出异常。
网友评论