KVC与KVO是Objective C的关键概念。
Key—Value Coding (KVC) 即是指NSKeyValueCoding,一个非正式的Protocol,提供一种机制间接访问对象的属性。KVO就是基于KVC实现的关键技术之一。
一 . KVC
(1) Key Value Coding是cocoa的一个标准组成部分,它能让我们可以通过name(key)的方式访问property, 不必调用明确的property accssor。 KVC定义了一种按名称访问对象的属性的机制,支持这种访问的主要方法是:
-(id)valueForKey:(NSString *)key;
-(void)setValue:(id)value forKey:(NSString *)key;
-(id)valueForKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
(2) 一个对象拥有某些属性。比如说,一个 Person 对象有一个 name 和一个 address 属性。以 KVC 说法,Person 对象分别有一个 value 对应他的 name 和 address 的 key。 key 只是一个字符串,它对应的值可以是任意类型的对象。从最基础的层次上看,KVC 有两个方法:一个是设置 key 的值,另一个是获取 key 的值。如下面的例子:
@property(nonatomic,copy) NSString * name;
取值:
NSString * n = [object valueForKey:@"name"];
设定:
[object setValue:@"Shi" forKey:@"name"];
(3)值得注意的是KVC不仅可以访问作为对象的属性,而且也能访问一些标量(例如int和CGFloat)和struct(例如CGRect)。例如:
@property(nonatomic) CGFloat height;
设置:
[object setValue@(20) forKey:@"height"];
(4) KVC还可以通过关系来访问对象。假设 person
对象有属性 address
,address
有属性 city
,我们可以这样通过 person
来访问 city:
[person valueForKeyPath:@"address.city"];
(5) 使用kvc时,如果代码中的key值不存在,会抛出异常,可以在类中通过重写它提供下面的这个方法来解决这个问题
- (void)setValue:(id)value forUndefinedKey:(NSString *)key;
setNilValueForKey:当对非类对象属性设置nil时,调用,默认抛出异常。
valueForUndefinedKey它的默认实现是抛出异常,可以重写这个函数做错误处理。
(6)setValuesForKeysWithDictionary 会为我们把和dictionaty的key名字相同的class proerty设置上dict中key对应的value。
二、KVO
Key-Value Observing(KVO)建立在KVC之上,它能够观察一个对象的KVC key path 值得变化。
(1)watchPersonForChangeOfAddress: 实现观察
(2)observeValueForKeyPath:ofObject:change:context; 在被观察的key path的值变化时调用。
(3)dealloc 停止观察