KVC 键值编码,是一种 NSKeyValueCoding非正式协议启用的一种机制。政策选用协议来直接拜访政策特征。

1、经过 key 设值或取值

  • setValue: forfey:
  • setValue: forKeyPath:

2、经过 keyPath 取值

  • valueForKey:
  • valueForKeyPath:

底层完结

setKey:value: 设值

  1. 查找是否有 setKey,_setKey,_setIsKey 三种 set办法,key 指成员变量
  2. 假定这三种key都没有找到,则去查找 accessInstanceVariablesDirectly 是否回数组初始化来 YES (默认回来YES),假定为 yes,则会查找直接拜访的实例变量进行赋值,依照 _key,_iskey,key,iskey 的次第搜索成员
  3. 假定没有找到 或许 accessInstanceVariablesDirectly 回来 NO,阐明 setter办法和实例变量都没有找到,系统会实施 setValue:forUndefinedKey: 办法,假定该办法没有完结会抛出 NSUndefinedKeyExcepti数组和链表的区别on 类型异常

KVC

valueForKe变量y: 取值

  1. 先查找 getter 办法,依照 getKey,key 的次第查找,假定找到实施第 5 步,不然实施第二步
  2. 查找 countOfKey,objectInKeyAtIndex,以及 keyAtIndexes
  • 假定找到 count数组去重OfKey和另外两个中的任意一个办法,则会创立一个呼应悉数 NSArray 的办法集结署理政策,并回来该政策,即 NSK变量类型有哪些eyValueArray,是 NSArray 的子类。
  • 署理政策随后将收到的悉数 na数组的界说raary消息转换为 c数组公式ou数组去重ntOfKey,objectInKeyAtInd变量类型有哪些ex 和 keyAtIndexes: 消息的某种组合,用来创立键值编码政策。
  • 假定原始政策还变量类型有哪些完结了一个名为 get变量Key:range: 之类的可选办法,则署理方变量类型有哪些针也将在恰当时运用该办法(留意:办法名的命数组去重数组公式规矩要契合 KVC 的标准命名办法,包含办法签名。)假定没有找到则进入第三部:
  1. 上面的办法都没有找到
  • 此时会一起查找 countOfKey,enumeratorOfK数组指针ey 和 memberOfKey 这三个办法。
  • 假定这三个办法都找变量与函数教案到,则会创立数组词一个呼应悉数变量名NSSet办法的集结署理政策,并回来该政策,此署理政策随后将其收到的悉数NSSet消息转换为countOfKey enumeratorOfKey memberOfKey 消息的某种组合,用于创立它的政策。
  • 假定没有找到则进变量名数组初始化第四步。
  1. 检查类办法 accessInst变量类型有哪些ance变量泵Variabl数组词esDirectly 是否为 YES,假定为YES,查找成员变量 _key,_iskey,key,iskey,假定找到 key 则进入第 5 步,假定没有找数组词到或许accessInstanceVariablesDirectly 为 NO 则进入第 6 步
  2. 根据找到的特征值类型,回来不同的成果,假定是指针类型,直接回来成果;假定是NSNumebr 支撑的标准类型,则将其存储在 NSNumeb变量之间的联系r 实例中,回来该值;假定都不是,则转换成 NSValue 类型,并回变量的界说来。
  3. 阐明没有找到对应的 key,此时会实施 va变量名lueForUndefinedKey 办法,假定该数组的界说办法未完结,则抛出 NSUndefinedKey数组词Exception 类型的异常。

KVC

自界说 KVC 赋值

自界说 set 办法的思维:

1.先判别key值是否存在,不存在就没必要持续,直接回来。

2.查找sett变量泵er办法,次第为setKey、_setKey、setIsKey。

3.判别accessInst变量的界说anceVariablesDirectly是否为变量名的命名规矩YES,为YES持续下面的流程,为NO就直接抛出异常。

4.直接拜访变量赋值(只赋值一次),赋值次第:_Key、_isKey、Key、isKey。

  • 界说一个收集实例变量的可变数组
  • 经过class_ge变量之间的联系tInstanceVariable获取相应的iv数组去重办法ar
  • 经过object_setIvar,对相对应的ivar进行赋值
  1. 假定找不到相关实例变量,则抛出异常

KVC

自界说 get 办法的思维:、

1.判别key,有必要非空。

2.查找相应的办法,次第:getKey、Key、countOfKey、objectInKeyAtIndex: (key都为传入的key值)。

3.判别accessInstanceVariables变量泵Directly是否为YES(是否可以直接赋值实例变量,YES是可以)。为NO则抛出异常。(抛出异常就为溃散)。

4.直接拜访实例变量,次第:_Key、_isKey、Key、isKey

  • 界说一个收集实例变量的可变数组
  • 经过class_getInstanceVariable,获取相应的ivar
  • 经过object_getIvar,回来相对应ivar值

KVC