好久没写过东西了,今天来写一点关于kvc的东西,巩固下自己的学习也和大家分享一下.下面我们就来先说下getter方法.
KVC 中getter用valueForKey方法去取对象成员变量的值,依次会去找4个成员变量,依次会去找4个成员变量,_key,_isKey,key,isKey.
例:
从打印结果中就可以看出寻找的顺序.但在寻找成员变量之前valueForKey会先去寻找getter方法,有3种getter方法,依次是getName,name,isName,同样自己实现下这三个方法就可以看出调用顺序.(因为valueForKey返回值是个id类型,不管你getter返回类型是什么样的类型,value都会包装成对象类型).如果没有实现getter方法会去找另两个个方法,-(NSInteger)countOfName和-(id)objectInNameAtIndex:(NSIteger)index(这两个方法必须一起实现),会返回一个数组类型,还有一个方法会返回NSSet的.(因为我也不知道这方法什么时候用,对这个方法也不是特了解,就不多解释这个了).如果上述方法都没有一个实现会去寻找另一个一个方法,是accessInstanceVariablesDirectly,这个方法默认返回是的是yes的,如果返回yes就会去找成员变量.如果返回no,就不会去找成员变量,会报:valueForUndefinedKey.如果没有上述方法和成员变量就要实现valueForUndefinedKey.防止崩溃.
取值方法还有一个valueForKeyPath方法,比如我又新建了一个Cat对象,Cat里有描述年龄的成员变量age,Cat又是Person类里的一个属性.我们想通过Person打印Cat里age这个成员变量,如图4:这样用valueForKey方法是不是太麻烦那.KVC就为我们提供了valueForKeyPath这个方法.如图5:keyPath就是去找成员变量或者属性的路径.就是用点来分离我们的key.先去找cat的getter的相关方法,找到后就回去去找cat里的成员变量age.
下面我们来说一下设值,调用setValue:forKey:这个方法,getter方法会依次去寻找getName,name,isName这三个取值方法,那setter设值时会有几个方法那?有两个,依次调用的是:setName和setIsName;如果这两个方法都没有,就会去修改我们的成员变量,设置成员变量的优先级和getter相同.同样在使用setValue:forKey时,如果没有找到两个setter方法,同样先会去找accessInstanceVariablesDirectly这个方法,再去找成员变量.同样没有成员变量,或者相关方法要实现setValue:forUndefinedKey:.还有一点就是如果你有一个属性是基本数据类型,你给你这个基本数据类型setValue:为nil时,程序就是奔溃.需设置setNilValueForKey:这个方法防止程序崩溃.
补充一下:KVC还有5个特殊集合运算符,分别是@avg,@count,@max,@min,@sun,其实从名字就能看出这些运算符的意思,百度一下用法特别简单,这里就不仔细说了.
有什么说的不清楚的或者有错误的地方希望大家给我指出留言.