关于KVC的一些思考

2018-11-28  本文已影响164人  ArchLL

今天看了一篇介绍KVC底层原理的文章,整体写的不错,同时也引起了我的一些思考,语法糖取值和赋值的原理是不是和KVC一样或相似呢?

在日常开发中我们会通过KVC给属性或者实例变量进行赋值/取值,由于我们平时使用属性较多,下面我将使用属性举例去讲解KVC的一些原理。

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

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

key方法缺失导致的crash
  1. KVCvalueforKey:的底层原理
valueforKey:
二、语法糖方式赋值和KVCsetValue:forKey:

1.语法糖方式赋值
正常情况下直接去调用setKey:这个方法,因为就算假设和KVC中的查找方法机制一致,setKey:优先级也是最高的,所以一定回调用setKey:这个方法;
如果没让系统帮你自动合成,也没有自己声明以及实现,赋值的时候会crash,并不会接着查找_setKey:setIsKey:方法,也不会去找_key等实例变量,

setKey:方法缺失导致的crash

2.KVCsetValue:forKey: 底层原理
因为接下来要使用KVC给属性赋值,所以需要先把属性自动合成的settergetter方法给屏蔽掉;
使用@dynamic修饰属性:不需要系统自动合成setter方法、getter方法、实例变量

setValue:forKey:
总结

1.语法糖方式取值/赋值只关注你的keysetKey:这两个方法是否声明和实现,和KVC的底层原理不同;
2.如果你通过给实例变量取值/赋值来查看KVC的底层原理的话,就不用这么麻烦了,你也可以看到关于成员变量的查找顺序。

上一篇下一篇

猜你喜欢

热点阅读