KVC与KVO

KVC-键值编码(Key Value Coding)

  • 动态设置:
    • setValue:属性值 forKey:属性名(用于简单路径)
    • setValue:属性值 forKeyPath:属性路径(用于复合路径,例如Person有一个Account类型的属性,那么person.account就是一个复合属性)
  • 动态读取:
    • valueForKey:属性名(用于简单路径)
    • valueForKeyPath:属性名(用于复合路径)

KVC使用起来比较简单,但是它是如何查找一个属性进行读取的呢?具体查找规则(假设现在要利用KVC对a属性进行读取):

  • 如果是动态设置属性,则优先考虑调用setA方法,如果没有该方法则优先考虑搜索成员变量a,如果仍然不存在则搜索成员变量a,如果最后仍然没搜索到则会调用这个类的setValue:forUndefinedKey:方法(注意搜索过程中不管这些方法、成员变量是私有的还是公有的都能正确设置_);
  • 如果是动态读取属性,则优先考虑调用a方法(a属性的getter方法),如果没有搜索到则会优先搜索成员变量a,如果仍然不存在则搜索成员变量a,如果最后仍然没搜索到则会调用这个类的valueforUndefinedKey:方法(注意搜索过程中不管这些方法、成员变量是私有的还是公共的都能正确读取_);

KVO-键值监听(Key Value Observe)

在ObjC中使用KVO操作常用的方法如下:

  • 注册指定Key路径的监听器:addObserver:forKeyPath:options:context:
  • 删除指定key路径的监听器:removeObserver:forKeypath:removeObservser:forKeyPath:context:;
  • 回调监听:observeValueForKeyPath:ofObject:change:context:

KVO的使用步骤也比较简单:

  1. 通过addObserver:forKeyPath:opetions:context:为被监听对象(通常是数据模型)注册监听器
  2. 重写监听器的observeValueForKeyPath:ofObject:change:context:方法
// cc监听了aa的name属性的改变
[aa addObserver:cc forKeyPath:@"name" options: NSKeyValueObservingOptionOld context:nil];
// cc得实现监听方法
/**
 * 当监听到object的keyPath属性发生了改变
 */
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"监听到%@对象的%@属性发生了改变, %@", object, keyPath, change);
}

区别与联系

  • KVC常见作用:给模型属性赋值
  • KVO常用作用:监听模型属性值的改变
  • KVC是路径访问的规范,KVO是观察某个变量的变化过程
  • KVC/KVO类似于代理,通知中心。都是一种通讯方法。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • KVC 什么是 KVC KVC 是 Key-Value-Coding 的简称。 KVC 是一种可以直接通过字符串的...
    LeeJay阅读 2,225评论 6 41
  • kvc简述 kvc即键值编码,在iOS中的应用主要体现在开发者通过key访问对象的属性或给对象的属性赋值。这样做最...
    RunnerFL阅读 509评论 0 0
  • 1. 概述 ObjC主要基于Smalltalk进行设计, 因此它有很多类似Ruby,Python的动态特性, 例如...
    ValienZh阅读 617评论 0 0
  • KVC、KVO概述 KVC(NSKeyValueCoding) "键-值 编码"是一种间接访问对象的属性的机制...
    Joker_King阅读 1,041评论 1 4
  • 键值编码KVC 可以利用字符串的方式去动态控制一个对象。其实由于OC的语言特性,你根部不必进行任何操作就可以进行属...
    一只小猪的360阅读 1,198评论 0 1