原文地址
中文翻译
简述
KVC
是通过对象用来提供间接访问其属性的NSKeyValueCoding
非正式协议来实现的一套机制
。当一个对象符合KVC时,它的属性可以通过给简洁统一的消息接口传递字符串参数来寻址,这套间接的访问机制对由实例变量及其关联的访问器方法提供的直接访问机制做出了补充。
你一般使用访问器方法
来访问一个对象的属性,getter
方法读取该属性的值,setter
方法写入该属性的值。在OC中,你也可以通过_实例变量
来直接访问属性。通过以上任一种方式访问对象的属性都是直截了当的,但是需要调用特定于属性的方法和变量名。当属性列表增加或更改时,对应的属性访问代码也必将随之更改,与其相反的,符合KVC
特性的对象提供了简便的消息接口,该接口对于所有的属性都是一致
的。
KVC是基于KVO、Cocoa bindings、 Core Data和AppleScript-ability等许多Cocoa技术的基本理念
。KVC也可以帮你在一些用例中简化代码
。
支持KVC特性的对象的使用
对象一般通过直接或间接继承NSObject
来拥有KVC特性,NSObject不仅遵循了NSKeyValueCoding
协议,而且为该协议约定的必需方法提供了默认实现。这样的对象让其他对象通过协定好的方法接口来做以下的事情:
- 访问对象属性: 这协议约定的方法,如获取方法-
valueForKey:
,设置方法-setValue:forKey:
,都是通过将属性的名称或键作为字符串参数key
来访问的。正如Accessing Object Properties的描述,这些方法和相关方法的默认实现使用该key来定位底层数据并与之交互的。 - 访问集合属性: 集合属性(比如NSArray)的访问方法的默认实现与其他属性的访问方法实现一摸摸一样样。另外,如果一个对象为其集合属性定义了访问器方法,将能通过
键-值
访问该集合的内容。正如Accessing Collection Properties的描述,这往往比直接访问更有效,并且允许你通过标准接口使用自定义的集合对象。 - 对集合对象使用集合操作符: 正如Using Collection Operators的描述,当访问一个支持KVC的对象的集合属性时,你可以在
key中
插入一个集合操作符
。集合操作符指示默认的NSKeyValueCoding
getter方法实现对该集合属性作出额外的操作,然后返回一个新的、筛选过的集合,或者返回具有某些特征的单个值。 - 访问非对象属性: 正如Representing Non-Object Values的描述,该协议的默认实现针对标量和结构体这些非对象属性做了检测,并且会对非对象属性自动封包、解包为对象来供相关接口使用。另外,当将nil设置为非对象属性的值时,该协议声明了一个方法来允许符合KVC的对象提供合适操作来兼容。
- key path访问属性: When you have a hierarchy of key-value coding compliant objects, you can use key path based method calls to drill down, getting or setting a value deep within the hierarchy using a single call.当你有一个多KVC兼容对象的层级结构时,你可以调用基于key path的方法来向下钻取,使得你能通过单次调用来读、写该层级中更深层次的属性。
一个对象如何实现KVC
为了让你的对象支持KVC,你应该确保这些对象遵循了NSKeyValueCoding
协议,并且实现了相应的方法,比如通用的getter方法valueForKey:
、通用的setter方法setValue:forKey:
。幸运的是,依据以上描述,NSObject遵循了该协议并为通用的getter、setter方法和其他必需方法提供了默认实现。因而,只要你的对象的祖先是NSObject,很多的工作都以为您实现。
为了让这些默认方法能正常工作,你需要确保对象的访问器方法和实例变量的定义遵守定义规范。这样才能允许这些默认方法找到对应的属性来响应对应的KVC消息。然后,通过提供验证方法和处理某些特殊情况的方法,可以选择扩展和自定义键值编码。