iOS KVC和KVO简介

kvc

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

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

常见的设置值方法有:

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

一对多关系成员的情况:

mutableArrayValueForKey://有序一对多关系成员  NSArray
mutableSetValueForKey://无序一对多关系成员  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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值