KVC是什么
-
kvc就是Key-Value Coding(键值编码)。
-
键值编码是NSKeyValueCoding非正式协议支持的一种机制,对象采用这种机制来提供对其属性的间接访问。当对象符合键值编码时,可以通过简洁,统一的消息传递接口通过字符串参数来访问其属性。这种间接访问机制补充了实例变量及其关联的访问器方法提供的直接访问。
-
通常,您使用访问器方法来访问对象的属性。 get访问器(或getter)返回属性的值。设置访问器(或设置器)设置属性的值。在Objective-C中,您还可以直接访问属性的基础实例变量。以上述任何一种方式访问对象属性都很简单,但是需要调用特定于属性的方法或变量名。随着属性列表的增加或更改,访问这些属性的代码也必须如此。相反,符合键值编码的对象提供了一个简单的消息传递接口,该接口在其所有属性之间都是一致的。
-
键值编码是许多其他Cocoa技术的基础概念,例如键值观察KVO,Cocoa bindings,Core Data和AppleScript-ability。在某些情况下,键值编码还可以帮助简化代码。
KVC可以做什么
- 访问对象属性。
- 操作集合属性。
- 在集合对象上调用集合运算符。
- 访问非对象属性。
- 通过键路径访问属性。
KVC设值
- 当调用setValue:forKey:设置属性value时,其底层的执行流程为
- 1,先按
set<Key>:
_set<Key>
setIs<Key>
顺序查找,找到就赋值,没找到就走第二步 - 2,查看
accessInstanceVariablesDirectly
是否返回YES,如果返回yes则通过成员变量直接赋值,其顺序为:_<key>
,_is<Key>
,<key>
, oris<Key>
,返回no则执行第三步 - 3,调用对象的
setValue:forUndefinedKey:
方法,默认会抛出一个异常,但是可以在子类里面重写这个方法处理
- 1,先按
KVC取值
- 当调用
valueForKey
获取属性value时,其底层的执行流程为- 1,先按
get<Key>
,<key>
,is<Key>
, or_<key>
,顺序查找,如果找到,则调用它并执行步骤5。否则,继续下一步。 - 2,如果没找到,则会在实例中查找countOf <Key>和objectIn <Key> AtIndex :和<key> AtIndexes :
如果找到其中的第一个以及其他两个中的至少一个,则创建一个响应所有NSArray方法的集合代理对象,并返回该对象。否则,请继续执行步骤3。 - 3,如果没有找到上面的几种方法,则会同时查找countOf <Key>,enumeratorOf<Key>和memberOf<Key>这三个方法
如果这三个方法都找到,则会创建一个响应所有NSSet方法的集合代理对象,并返回该对象,此代理对象随后将其收到的所有NSSet消息转换为countOf<Key>,enumeratorOf<Key>和memberOf<Key>:消息的某种组合,用于创建它的对象 - 4,如果没有找到简单的访问器方法或集合访问方法组,并且接收方的类方法accessInstanceVariablesDirectly返回YES,则搜索名为_ <key>,_ is <Key>,<key>或is <Key>的实例变量,以该顺序。如果找到,请直接获取实例变量的值,然后继续执行步骤5。否则,请继续执行步骤6。
- 5,如果检索到的属性值是对象指针,则只需返回结果。
如果该值是NSNumber支持的标量类型,则将其存储在NSNumber实例中并返回它。
如果结果是NSNumber不支持的标量类型,请转换为NSValue对象并返回该对象。
6,如果所有其他方法均失败,则调用valueForUndefinedKey:。默认情况下,这会引发一个异常,但是NSObject的子类可以提供特定于键的行为。
- 1,先按
网友评论