KVC

KVC(KeyValueCoding):(键值编码)非正式协议(Informal Protocol)【非正式协议:不需要遵循

1. 能做什么?

* 可以通过 `name(key)` 去**隐式**地访问某个对象的属性(**`注意点:name(key)必须和属性名字一样。`**)。

2. 适用场景(什么样的类型满足 KVC )

只要继承自 NSObject 的类都是满足 KVC 的

显示的访问某个对象的属性的方式:

  • 方式1:setter/getter 方法
  • 方式2:(.xx)点语法直接访问(读/写)

3. 怎么做?

方式1

设置属性值 -(void)setValue:(nullable id)value forKey:(NSString *)key; 获取属性值 -(id)valueForKey:(NSString *)key;

方式2

设置属性值 -(void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath; 获取属性值 -(id)valueForKeyPath:(NSString *)keyPath;

4. 总结

  1. KVC 利用动态语言(OC/Ruby。。。)运行的机制
  2. KVC 两种设置和获取的方式(key/keyPath);遵循原则:key/keyPath 中包含值和属性值名字一样
  3. 优势:
    • 可以使用 KVC 方式对私有属性进行访问(设置/获取);
    • 可以访问(设置/获取)嵌套属性的值(只能用 keyPath)

KVO

KeyValueObserver(键值观察机制)

1. 使用范围

只要是继承自 NSObject 的类都适用 KVO 机制

2. 能做什么?

  • 监听某个、某些属性值的变化,做出响应的机制
  • 当被观察者的值发生变化,会自动发送通知给观察者,进而观察者作出相应的感应(更新数据到界面…)

3. 如何做?

执行三步

  1. 明确观察者和被观察者;创建两个对象
  2. 被观察者对象需要调用 addObserver 方法,注册观察者对象
  3. 观察者需要实现 observeValueForKeyPath 方法,获取观察(监听) 的值(包含初始值、旧值、更新后的值)

KVO 和 NSNotification 的区别?

  1. 前者是观察者对象被观察者对象建立联系,监听和被监听的关系(直接联系);后者是监听对象被监听对象通知中心建立的联系,(间接联系
  2. 当前者监听到值变化,自动触发方法;后者监听到变化时需要自己写触发方法select