KVC与KVO的用处

在刚刚学习KVC时,我感觉这个东西非常奇怪:它完全可以用"."操作符替代,而且"."更加简单方便。为什么还会有这样一个东西呢?

说起来,KVC的作用还真不大,但在特定的情境下,它还是有一些用处的,我现在发现它的用处主要有两个方面。

一,它可以动态地访问特性。

这句话不好理解,举个例子吧。现在有许多字母,我们要统计某个字母有没有出现。这些字母被存储在一个NSArray里,遍历Array,当遇到"a"这个字母时,就将一个名为"a"的属性设为@"yes",即:

if(letter isEqualToString:@"a")
    self.a=@"yes";
if(letter isEqualToString:@"b")
    self.b=@"yes";
...
这种方式实在比较蛋疼,代码质量比较差劲。如果用了KVC的方式,就比较好看了。

[self setValue:@"yes" forKey:s];
这样,就能动态地处理数据了。

二,它可以支持KVO,即Key-Value Observation,即监视属性的变化并进行一些操作。

使用过UITableView的人一定知道,当对TableView的数据源进行修改时,比如增加一条数据,需要刷新TableView。如果在许多地方进行修改,则需要不断刷新,实在是比较麻烦。

我们可以使用KVO的方法,在数据源改变之后,自动重新加载TableView。假如一个TableView是从array这个属性中获取并组织数据的,那么我们可以添加一句话:

[self addObserver:self forKeyPath:@"array" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
然后加入一个方法,用来定义接到变化后处理的方式:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if ([keyPath isEqualToString:@"array"]) {
        [self.tableView reloadData];
    }
}
这样,系统就能够在self.array发生变化时自动刷新tableView了。

不过使用KVO有一个比较讨厌的地方,当接收者tableView被销毁时,也要同时取消监听:

[self removeObserver:self forKeyPath:@"array"];
如果不这样的话,在array改变时,就会报错。

不过,即使有这样讨厌的地方,KVO仍然不失为一个有用的工具。


总体来看,我觉得KVC的作用仍然不太大,基本上属于食之无味,弃之可惜的鸡肋。

你可能感兴趣的:(KVC与KVO的用处)