KVC与KVO
本文将会详解在面试中的常客——KVO实现的原理,在了解KVO之前我们要对KVC进行一个全面的了解,毕竟连官方文档都提到过:
important: In order to understand key-value observing, you must first understand key-value coding.
1.1KVC
KVC全称:Key-value coding(键-值编码),通过KVC机制我们可以间接的访问对象的属性。而KVC之所以能够访问属性是因为对象遵守了一个非正式的NSKeyValueCoding
协议(NSObject开始就遵守了此协议,所以继承自NSObject的对象都可以使用KVC)。开发中我们都知道在对于属性可以使用getter
和setter
或者直接使用实例变量来进行直接访问和修改。但这些访问方式是需要依靠属性的get
方法、set
方法、变量名。随着对象定义的属性增加或者变动。编译器生成的这些getter
、setter
会越来越多。KVC则是通过是用字符串的名字Key来对属性进行访问和修改。
KVC中最关键的两个方法:
-valueForKey:
-setValue:forKey:
1.1.1 valueForKey:
-valueForKey:
是通过\来获取属性的值。在一个对象实例中按get<Key>
、<key>
、is<Key>
、_<key>
顺序匹配。命中的Value的类型如果是对象直接返回。如果命中的Value是能被包装成NSNumber的数值类型。包装成NSNumber返回。不支持NSNumber的数值类型则包装成NSValue返回。如果没用命中调用-valueForUndefinedKey:
抛出异常,valueForUndefinedKey:
可在子类中重写忽略抛出的异常,自己处理。
@interface Person
@property (nonatomic, assign) CGFloat height;
@end
p.height = 119.0;
NSNumber *height = [p valueForKey:@"height"]; //CGFloat 包装成NSNumber。
注意
- 上述的查找过程中省略了很多其他情况下的查找
countOf<Key>
,objectIn<Key>AtIndex:
,countOf<Key>
,enumeratorOf<Key>
,memberOf<Key>:
,有兴趣的同学可以去