KVC和KVO

KVC (Key-Value Coding)


KVC(键值编码)是一种间接访问和更改对象状态的方式,其实现方法是使用字符串表示要更改的对象状态。将对象的属性名作为key,它们对应的值则是value,使用valueForKey:可以返回key对应的value,使用setValue: forKey:可以修改key对应的value。例如:

Fruit *fruit = [Fruit new];
[fruit setValue:@"orange" forKey:@"name"];
[fruit setValue:@20.0f forKey:@"price"];
NSLog(@"name is %@", [fruit valueForKey:@"name"]);
NSLog(@"price is %f", [[fruit valueForKey:@"price"] floatValue]);
打印结果:
2015-07-31 16:32:59.492 KVC&KVOTest[4741:282308] name is orange
2015-07-31 16:32:59.493 KVC&KVOTest[4741:282308] price is 20
注意:fruit.pricefloat型,使用 [fruit valueForKey:@"price"]得到的值Cocoa会自动将值放入NSNumberNSValue中,同理,若value是标量值,则使用setValue: forKey:需要将value转为NSNumberNSValue。上例中使用@20.0f就是将float转为了NSNumber

除了通过key访问value外, KVC还支持使用keyPath访问value,例如:

[fruit setValue:@"wuhan" forKeyPath:@"place.name"];
NSLog (@“Place is %@.”,[fruit valueForKeyPath:@"place.name"]);

最后,使用KVC不仅可以访问声明在.h文件中的成员变量,声明在.m文件中的成员变量一样可以用KVC进行访问!不过这种做法可能会产生意想不到的错误。。。

KVO (Key-Value Observing)


KVO(键值观察)是建立在KVC之上的一种观察KVC中value变化的技术。
使用[object addObserver: observer forKeyPath: path option: option context: context]为Object的keyPath对应的value添加一个观察者observer,其中,用context带入一些任意类型的参数,用option选择操作,option有四种:
NSKeyValueObservingOptionNew: 把更改之前的值传给处理方法
NSKeyValueObservingOptionOld: 把更改之后的值传给处理方法
NSKeyValueObservingOptionInitial: 把初始化的值传给处理方法,一旦注册,立刻就会调用一次
NSKeyValueObservingOptionPrior: 分两次调用,值改变前和值改变后

对应的处理方法是:-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
如果之前的option选择了NSKeyValueObservingOptionNew则可以使用[change objectForKey:@"new"]来获取更改之后的值,而如果option选择了NSKeyValueObservingOptionOld则可以使用[change objectForKey:@"old"]来获取更改之前的值。
最后,在不再使用观察者的时候要注意移除观察者,具体代码是[object removeObserver:observer forKeyPath:path];如果你没有使用ARC技术,那么可以在- (void)dealloc方法中移除观察者,具体做法是:

- (void)dealloc

{

[super dealloc];

[object removeObserVer:observer forKeyPath:path];

[object release];

}

你可能感兴趣的:(KVC和KVO)