今天看了一篇介绍
KVC底层原理的文章,整体写的不错,同时也引起了我的一些思考,语法糖取值和赋值的原理是不是和KVC一样或相似呢?
在日常开发中我们会通过KVC给属性或者实例变量进行赋值/取值,由于我们平时使用属性较多,下面我将使用属性举例去讲解KVC的一些原理。

分别使用语法糖和KVC方式给属性赋值
一、语法糖方式取值和 KVC的valueforKey:
- 语法糖方式取值会调用属性的
getter方法:由下图可以看出,并没去调用在KVC机制中优先级更高的getAge方法

语法糖方式调用getter方法
如果你使用了@dynamic去修饰属性(不让系统帮助去自动生成对应属性的setter方法和getter方法),且也没有自己实现key的getter方法,则取值的时候会发生crash; 如果你重写了key的getter方法,则可以正常取值,但是并不会并不会去查找getKey这个在KVC机制中优先级更高的方法,也不会去找_key等实例变量

key方法缺失导致的crash
-
KVC的valueforKey:的底层原理

valueforKey:
补充:accessInstanceVariablesDirectly的默认值为YES
二、语法糖方式赋值和KVC的setValue:forKey:
- 语法糖方式赋值
直接去调用setKey:这个方法,即便语法糖中和KVC中的查找方法机制一致,setKey:优先级也是最高的,所以一定会调用setKey:这个方法;
如果该方法没让系统帮你自动生成,赋值的时候会crash,并不会像KVC机制那样接着查找_setKey:和setIsKey:方法,更不会去找_key等实例变量

setKey:方法缺失导致的crash
-
KVC的setValue:forKey:底层原理
setValue:forKey:
总结
- 语法糖方式取值/赋值只关注你的
key和setKey:这两个方法是否声明和实现,和KVC的底层原理不同 - 如果你通过给实例变量取值/赋值来查看
KVC的底层原理的话,就不用这么麻烦了,也可以看到关于成员变量的查找顺序
