·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> 关情纸尾-----UIKit基础-简述KVC和KVO

关情纸尾-----UIKit基础-简述KVC和KVO

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

√  概述

 

KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCoding/NSKeyValueObserving 非正式协议的形式被定义为基础框架的一部分。从协议的角度来说,KVC/KVO本质上是定义了一套让我们去遵守和实现的方法,KVC/KVO实现的根本是Objective-C的动态性和runtime。

 

 

  键值编码KVC

全称是Key-value observing,翻译成键值观察。提供了一种当其它对象属性被修改的时候能通知当前对象的机制。再MVC大行其道的Cocoa中,KVO机制很适合实现model和controller类之间的通讯。

 KVC的操作方法由NSKeyValueCoding协议提供,而NSObject就实现了这个协议,也就是说ObjC中几乎所有的对象都支持KVC操作。

常用的KVC操作方法如下:

 ¤  动态设置: setValue:属性值 forKey:属性名(用于简单路径)、setValue:属性值 forKeyPath:属性路径(用于复合路径,例如Person有一个name类型的属性,那么person.namet就是一个复合属性)

 ¤ 动态读取: valueForKey:属性名 valueForKeyPath:属性名(用于复合路径)

 

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

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

 点语法和KVC

在上面介绍的 ¤ 动态读取 中的KeyPath是一个被点操作符隔开的用于访问对象的指定属性的字符串序列。比如KeyPath address.将会访问消息接收对象所包含的person.name属性中包含的一个name属性。其实KeyPath说白了就是我们平时使用点操作访问某个对象的属性时所写的那个字符串。

在实现了访问器方法的类中,使用点语法和KVC访问对象其实差别不大,二者可以任意混用。但是没有访问起方法的类中,点语法无法使用,这时KVC就有优势了。

 

√  键值监听KVO

KVO其实是一种观察者模式,利用它可以很容易实现视图组件和数据模型的分离,当数据模型的属性值改变之后作为监听器的视图组件就会被激发,激发时就会回调监听器自身。在ObjC中要实现KVO则必须实现NSKeyValueObServing协议,不过幸运的是NSObject已经实现了该协议,因此几乎所有的ObjC对象都可以使用KVO。

常用的操作方法如下:

♥ 注册指定Key路径的监听器: addObserver: forKeyPath: options:  context:

♥ 删除指定Key路径的监听器: removeObserver: forKeyPathremoveObserver: forKeyPath: context:

♥ 回调监听: observeValueForKeyPath: ofObject: change: context:

 

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

  1. 通过addObserver: forKeyPath: options: context:为被监听对象(它通常是数据模型)注册监听器
  2. 重写监听器的observeValueForKeyPath: ofObject: change: context:方法