KVC (Key-Value Coding)
KVC(键值编码)是一种间接访问和更改对象状态的方式,其实现方法是使用字符串表示要更改的对象状态。将对象的属性名作为key,它们对应的值则是value,使用<code>valueForKey:</code>可以返回key对应的value,使用<code>setValue: forKey:</code>可以修改key对应的value。例如:<pre><code>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]);</code> </pre>打印结果:<pre><code>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</code> </pre>注意:<code>fruit.price</code>是<code>float</code>型,使用<code> [fruit valueForKey:@"price"]</code>得到的值Cocoa会自动将值放入<code>NSNumber</code>或<code>NSValue</code>中,同理,若value是标量值,则使用<code>setValue: forKey:</code>需要将value转为<code>NSNumber</code>或<code>NSValue</code>。上例中使用<code>@20.0f</code>就是将<code>float</code>转为了<code>NSNumber</code>。
除了通过key访问value外, KVC还支持使用keyPath访问value,例如:<pre><code>[fruit setValue:@"wuhan" forKeyPath:@"place.name"];
NSLog (@“Place is %@.”,[fruit valueForKeyPath:@"place.name"]);</code> </pre>
最后,使用KVC不仅可以访问声明在.h文件中的成员变量,声明在.m文件中的成员变量一样可以用KVC进行访问!不过这种做法可能会产生意想不到的错误。。。
KVO (Key-Value Observing)
KVO(键值观察)是建立在KVC之上的一种观察KVC中value变化的技术。
使用<code>[object addObserver: observer forKeyPath: path option: option context: context]</code>为Object的keyPath对应的value添加一个观察者observer,其中,用context带入一些任意类型的参数,用option选择操作,option有四种:
<code>NSKeyValueObservingOptionNew</code>: 把更改之前的值传给处理方法
<code>NSKeyValueObservingOptionOld</code>: 把更改之后的值传给处理方法
<code>NSKeyValueObservingOptionInitial</code>: 把初始化的值传给处理方法,一旦注册,立刻就会调用一次
<code>NSKeyValueObservingOptionPrior</code>: 分两次调用,值改变前和值改变后
对应的处理方法是:<code>-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;</code>
如果之前的option选择了<code>NSKeyValueObservingOptionNew</code>则可以使用<code>[change objectForKey:@"new"]</code>来获取更改之后的值,而如果option选择了<code>NSKeyValueObservingOptionOld</code>则可以使用<code>[change objectForKey:@"old"]</code>来获取更改之前的值。
最后,在不再使用观察者的时候要注意移除观察者,具体代码是<code>[object removeObserver:observer forKeyPath:path];</code>如果你没有使用ARC技术,那么可以在<code>- (void)dealloc</code>方法中移除观察者,具体做法是:<pre><code>- (void)dealloc
{
[super dealloc];
[object removeObserVer:observer forKeyPath:path];
[object release];
}
</code></pre>
网友评论