iOS开发实战 - 关于KVC的一些思考

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

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

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

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

key方法缺失导致的crash
  1. KVCvalueforKey:的底层原理
valueforKey:

补充:accessInstanceVariablesDirectly的默认值为YES

二、语法糖方式赋值和KVCsetValue:forKey:
  1. 语法糖方式赋值
    直接去调用setKey:这个方法,即便语法糖中和KVC中的查找方法机制一致,setKey:优先级也是最高的,所以一定会调用setKey:这个方法;
    如果该方法没让系统帮你自动生成,赋值的时候会crash,并不会像KVC机制那样接着查找_setKey:setIsKey:方法,更不会去找_key等实例变量
setKey:方法缺失导致的crash
  1. KVCsetValue:forKey: 底层原理
    setValue:forKey:
总结
  1. 语法糖方式取值/赋值只关注你的keysetKey:这两个方法是否声明和实现,和KVC的底层原理不同
  2. 如果你通过给实例变量取值/赋值来查看KVC的底层原理的话,就不用这么麻烦了,也可以看到关于成员变量的查找顺序
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文参考: KVC官方文档 KVC原理剖析 iOS KVC详解 KVC 简介 KVC全称是Key Value Co...
    拧发条鸟xds阅读 10,676评论 6 23
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,803评论 1 32
  • 原文:iOS 关于KVC的一些总结 本文参考: KVC官方文档 KVC原理剖析 iOS KVC详解 KVC 简介 ...
    liyoucheng2014阅读 4,463评论 0 3
  • 鲁达, 这个在水浒传里并不怎么起眼的人物,对我而言他才是真正的英雄,真正的好汉。 在梁山泊一百单八名"好汉...
    樊书宁阅读 619评论 0 0
  • export M2_HOME=/opt/apache-maven-3.3.9 export GRADLE_HOME...
    百炼阅读 1,118评论 0 0