聊一聊KVC

2020-12-23  本文已影响0人  晨阳Xia

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吗?

可以。
原理如下图:


image.png

过程描述:
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的取值和赋值过程是什么?原理是什么?

image.png

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

kvc求均值、最大值、最小值

上一篇 下一篇

猜你喜欢

热点阅读