美文网首页
关于KVC的一些思考

关于KVC的一些思考

作者: ArchLL | 来源:发表于2018-11-28 22:05 被阅读164次

    今天看了一篇介绍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的底层原理的话,就不用这么麻烦了,你也可以看到关于成员变量的查找顺序。

    相关文章

      网友评论

          本文标题:关于KVC的一些思考

          本文链接:https://www.haomeiwen.com/subject/jnazqqtx.html