美文网首页
Objective-C 语言特性之KVC

Objective-C 语言特性之KVC

作者: 锋尚达人 | 来源:发表于2021-03-19 12:36 被阅读0次

    KVC 简单来说,就是键值编码,通过获取对象对应的key,来获取和设置对应的属性值。使用过程中可以通过key,也可以通过keyPath对复杂对象的某个成员变量进行取值和赋值。本文主要对kvc的取值过程和设置值过程做简单梳理。

    (1)kvc 获取值过程(valueForKey:

            按照getKey,key,isKey, _key顺序查找方法,没有找到方法。会查看accessInstanceVariablesDirectly方法的返回值,来确定是否能够设置该对象的成员变量,如果返回值为Yes,会按照key,_isKey、key、isKey顺序查找成员变量。(注意:accessInstanceVariablesDirectly方法 ,默认返回Yes。

    取值过程

    (2)设置值 (setValue:forKey:

            首先按照setKey,_setKey:方法进行查找,如果查找不到,会查看accessInstanceVariablesDirectly方法的返回值,来确定是否能够设置该对象的成员变量,如果返回值为Yes,则会_key、_isKey、key、isKey,顺序对对象进行赋值。

    设置值过程

    (3)通过KVC修改属性会触发KVO么?

      会触发KVO。

            具体原因:首先当我们通过kvc 的set方法设值时,系统会查找setkey的方法,如果有,就会调用对应的setter方法,根据KVO的机制,会触发KVO。

            另外,由于kvc的设值机制(setkey,_setKey方法,找不到,会查看accessInstanceVariblesDirect方法的返回值,如果返回yes 会按照_key,_isKey,key,isKey 顺序继续查找变量,并且accessInstanceVariblesDirect方法默认返回Yes)所以只要找到对应的成员变量,就算没有set方法,kvc内部也会触发KVO(因为KVC内部做了监听机制,具体原理未探究)。

    相关文章

      网友评论

          本文标题:Objective-C 语言特性之KVC

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