KVC是由NSKeyValueCoding
非正式协议启用的一种机制,对象通过这种协议间接的访问它的属性。当一个对象支持KVC时,它的属性可以使用一个简洁统一的消息接口通过字符串参数进行寻址。这种间接访问机制可以作为通过实例变量和其相关访问方法的直接访问机制的一种补充。
我们通常使用accessor
方法来访问对象的属性。getter方法返回属性的value
,setter为属性的value
赋值。在Objective-C里,我们可以直接访问属性的实例变量。但是需要调用属性的特定方法或者变量名称。随着属性列表的增长或更改,这些方法也要随之更改。相比之下,KVC提供了一个简单的消息传递接口。
KVC 是许多其他Cocoa
技术的基本原理,比如key-value observing
, Cocoa bindings
, Core Data
和 AppleScript-ability
。在某些情况下,kvc可以使代码更简洁.
使用
直接或者间接继承NSObject
的对象支持KVC,采用NSKeyValueCoding
协议并且为基本方法都提供了默认的实现。这样对象可以通过一个简洁的消息接口能够执行以下操作:
-
访问对象属性: 代理指定了一些访问方法,比如
valueForKey:
方法以及setValue:forKey:
,通过key
访问对象的属性。这些或者其相关方法的默认实现是使用key
来查找底层数据并与之交互。正如Accessing Object Properties.描述的一样 -
操作集合属性: 访问方法的默认实现是跟处理其他任何属性一样,对集合属性(比如
NSArray
对象)进行处理。另外,如果一个对象为一个属性定义了集合访问方法,就能够对集合的内容进行键值访问。这通常比直接访问更有效率,而且可以通过标准接口处理自定义的集合对象。详细描述在Accessing Collection Properties. -
使用集合对象的集合运算符: 当访问对象的集合属性时,可以插入一个
collection operators(集合运算符)
到key字符串,详细可以查看Using Collection Operators.集合运算符允许NSKeyValueCoding
协议的默认 getter 对集合进行操作,然后返回集合的过滤版本,或者表示集合中的某些特性的单个值。 -
访问非对象属性: 该协议的默认实现会检测非对象属性,包括基本数据变量和结构体,并自动将它们打包或解包为对象,更多描述可以查看Representing Non-Object Values。另外,该协议声明了一种方法,当通过kvc接口为一个非对象属性设置一个
nil
值的时候,该方法允许对象提供一个合适的行为进行操作。 -
通过key path访问属性: 当对象具有层次结构时,可以使用基于
key path
的方法进行深层访问。
支持KVC的对象
为了使对象支持 KVC,需要遵守NSKeyValueCoding
非正式协议并实现相应的方法,比如valueForKey:
作为通用的getter方法,setValue:forKey:
方法作为通常的setter方法。不过,NSObject
已经采用了该协议并且为协议的基本方法提供了默认的实现,如果继承了NSObject
(或者其子类),很多工作就已经做好了。
为了默认的方法能够完成任务,你需要确保你对象的访问器方法和实例变量符合某些定义明确的模式。这允许默认的实现来查找对象的属性,以响应kvc消息。 然后我们可以通过提供验证方法和处理某些特殊情况选择性地扩展和自定义kvc。
网友评论