KVC 和 KVO
文章目录
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. 总结
- KVC 利用动态语言(OC/Ruby。。。)运行的机制
- KVC 两种设置和获取的方式(key/keyPath);遵循原则:key/keyPath 中包含值和属性值名字一样
- 优势:
- 可以使用 KVC 方式对私有属性进行访问(设置/获取);
- 可以访问(设置/获取)嵌套属性的值(只能用 keyPath)
KVO
KeyValueObserver(键值观察机制)
1. 使用范围
只要是继承自 NSObject 的类都适用
KVO
机制
2. 能做什么?
- 监听某个、某些属性值的变化,做出响应的机制
- 当被观察者的值发生变化,会自动发送通知给观察者,进而观察者作出相应的感应(更新数据到界面…)
3. 如何做?
执行三步
- 明确观察者和被观察者;创建两个对象
- 被观察者对象需要调用
addObserver
方法,注册观察者对象 - 观察者需要实现
observeValueForKeyPath
方法,获取观察(监听) 的值(包含初始值、旧值、更新后的值)
KVO 和 NSNotification 的区别?
- 前者是观察者对象和被观察者对象建立联系,监听和被监听的关系(直接联系);后者是监听对象和被监听对象与通知中心建立的联系,(间接联系)
- 当前者监听到值变化,自动触发方法;后者监听到变化时需要自己写触发方法
select
。
文章作者 Rango
上次更新 2022-04-16