iOS KVC和KVO简介

来源:互联网 发布:淘宝店铺介绍在哪里看 编辑:程序博客网 时间:2024/06/10 03:36

kvc

KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,它是一种可以直接通过字符串的名字(key)来访问类属性的机制(一种间接访问对象的属性的机制)。
常见的 获取值方法有:

valueForKey://传入NSString属性的名字。valueForKeyPath: //传入NSString属性的路径,xx.xx形式。valueForUndefinedKey //它的默认实现是抛出异常,可以重写这个函数做错误处理。

常见的设置值方法有:

setValue:forKey:setValue:forKeyPath:setValue:forUndefinedKey:setNilValueForKey: //当对非类对象属性设置nil时,调用,默认抛出异常。

一对多关系成员的情况:

mutableArrayValueForKey://有序一对多关系成员  NSArraymutableSetValueForKey://无序一对多关系成员  NSSet

KVC实现步骤:
setValue:forKey的搜索方式:
首先搜索set<key>:方法
如果成员用@property,@synthsize处理,因为@synthsize告诉编译器自动生成set:格式的setter方法,所以这种情况下会直接搜索到。
注意:这里的是指成员名,而且首字母大写。下同。
上面的setter方法没有找到,如果类方法accessInstanceVariablesDirectly返回YES(注:这是NSKeyValueCodingCatogery中实现的类方法,默认实现为返回YES)。
那么按_<key>,_is<Key>,<key>,is<key>的顺序搜索成员名。
如果找到设置成员的值,如果没有调用setValue:forUndefinedKey:。

valueForKey:的搜索方式:
1. 首先按get<Key>、<key>、is<Key>的顺序查找getter方法,找到直接调用。如果是bool、int等内建值类型,会做NSNumber的转换。
2. 上面的getter没有找到,查找countOf<key>、objectIn<Key>AtIndex:、<Key>AtIndexes格式的方法。如果countOf<Key>和另外两个方法中的一个找到,那么就会返回一个可以响应NSArray所有方法的代理集合(collection proxy object)。发送给这个代理集合(collection proxy object)的NSArray消息方法,就会以countOf<Key>、objectIn<Key>AtIndex:、<Key>AtIndexes这几个方法组合的形式调用。还有一个可选的get:range:方法。
3. 还没查到,那么查找countOf<Key>、enumeratorOf<Key>、memberOf<Key>:格式的方法。
如果这三个方法都找到,那么就返回一个可以响应NSSet所有方法的代理集合(collection proxy object)。发送给这个代理集合(collection proxy object)的NSSet消息方法,就会以countOf<Key>、enumeratorOf<Key>、memberOf<Key>:组合的形式调用。
4. 还是没查到,那么如果类方法accessInstanceVariablesDirectly返回YES,那么按_<key>,_is<Key>,<key>,is<key>的顺序直接搜索成员名。
5. 再没查到,调用valueForUndefinedKey:

0 0
原创粉丝点击