kvc的作用就不多说了,网上一大堆。这里主要介绍它的赋值和取值过程
赋值过程
- 先找相关方法 set<Key>:, _set<Key>:, setIs<Key>:
- 若没有相关方法 + (BOOL)accessInstanceVariablesDirectly,判断是否可以直接方法成员变量
- 如果是判断是NO,直接执行KVC的setValue:forUndefinedKey:(系统抛出一个异常,未定义key)
- 如果是YES,继续找相关变量_<key> _is<Key> <key> is<Key>
- 方法或成员都不存在,setValue:forUndefinedKey:方法,默认是抛出异常
相关实现可以参考demo
取值过程
取值的过程和赋值过程是一样的,可以通过demo查看
异常处理
异常主要有两种情况:
- 赋的值是空。如果给对象赋值nil没关系。可是给值类型(基本数据类型)赋值nil,会报错。但是不要怕,我们可以通过
setNilValueForKey
方法来捕获异常,当给非对象类型赋值为nil是会调用这个方法 - key不存在,这种情况又分为两种情况,第一:赋值的key不存在 ;第二:取值的key不存在。分别可以通过
setValue:forUndefinedKey:
方法和valueForUndefinedKey
来捕获异常
上述两个方法只要在相应的类中进行重写即可
具体使用方法情可见demo
KVC正确性的验证
这里不做介绍,用的也少,有兴趣可以自己了解一下,
从validateValue方法入手。可以判断value的有效性,还有方法判断key的有效性。
网友评论