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内部做了监听机制,具体原理未探究)。
网友评论