关于KVC的一些思考
2018-11-28 本文已影响164人
ArchLL
今天看了一篇介绍
KVC
底层原理的文章,整体写的不错,同时也引起了我的一些思考,语法糖取值和赋值的原理是不是和KVC
一样或相似呢?
在日常开发中我们会通过KVC
给属性或者实例变量进行赋值/取值,由于我们平时使用属性较多,下面我将使用属性举例去讲解KVC
的一些原理。
一、语法糖方式取值和 KVC
的valueforKey:
- 语法糖方式取值会调用属性的
getter
方法:由下图可以看出,并没去调用在KVC
机制中优先级更高的getAge
方法
但如果你没让系统帮你自动合成setter
方法(使用@dynamic
修饰属性),也没有自己重写(声明以及实现 key
这个getter
方法),取值的时候会crash
; 如果你重写了key
这个getter
方法,则可以正常取值,但是并不会并不会去查找getKey
这个在KVC机制中优先级更高的方法,也不会去找_key
等实例变量
-
KVC
的valueforKey:
的底层原理
二、语法糖方式赋值和KVC
的setValue:forKey:
1.语法糖方式赋值
正常情况下直接去调用setKey:
这个方法,因为就算假设和KVC中的查找方法机制一致,setKey:
优先级也是最高的,所以一定回调用setKey:
这个方法;
如果没让系统帮你自动合成,也没有自己声明以及实现,赋值的时候会crash
,并不会接着查找_setKey:
和setIsKey:
方法,也不会去找_key
等实例变量,
2.KVC
的setValue:forKey:
底层原理
因为接下来要使用KVC
给属性赋值,所以需要先把属性自动合成的setter
和getter
方法给屏蔽掉;
使用@dynamic
修饰属性:不需要系统自动合成setter
方法、getter
方法、实例变量
总结
1.语法糖方式取值/赋值只关注你的key
和setKey:
这两个方法是否声明和实现,和KVC
的底层原理不同;
2.如果你通过给实例变量取值/赋值来查看KVC
的底层原理的话,就不用这么麻烦了,你也可以看到关于成员变量的查找顺序。