什么是 KVC 和 KVO?在 IOS 开发中有哪些应用场景?代码举例讲解

KVC 和 KVO 是 iOS 中两个很重要的概念:
KVC(Key-Value Coding) 是一种通过字符串键(key)来访问属性(property)的机制。它允许你在运行时使用键来设置和访问对象的属性,而不需要在编译时指定属性。
KVO(Key-Value Observing) 是观察属性值改变的机制。它允许一个对象观察另一个对象的属性,并在属性值改变时接收通知。

这两个概念在 iOS 开发中有很重要的应用场景:

  1. KVC 可以动态设置和访问对象属性,这在一些反射场景下很有用,比如解析 JSON 数据动态构建模型对象。
objc
NSDictionary *dict = @{@"name": @"Jack", @"age": @18};
Person *p = [Person new];
[p setValuesForKeysWithDictionary:dict];  // 使用 KVC 设置属性
  1. KVO 可以观察属性值的改变,这在 MVVM 架构中非常重要,ViewModel 可以观察 Model 属性的改变并更新 View。
objc
// ViewModel 观察 Person 对象
[self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];

// 监听到属性改变时调用
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context 
{
    if ([keyPath isEqualToString:@"name"]) {
        self.name = self.person.name;
    }
}
  1. KVO 也经常用于监听 ScrollView 的内容滚动,这个在下拉刷新等场景下很有用。
objc
[self.scrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context  
{
    if ([keyPath isEqualToString:@"contentOffset"]) {
        // 根据滚动位置判断是否显示下拉刷新视图
    }
}