KVC和KVO

作者: koce_zhao | 来源:发表于2015-08-01 09:36 被阅读98次

    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>

    相关文章

      网友评论

          本文标题:KVC和KVO

          本文链接:https://www.haomeiwen.com/subject/lzfvqttx.html