KVC底层实现原理

  • Post author:
  • Post category:其他





KVC,兼职编码,是OC中很常用的一种赋值/取值方法,原理也是基于Runtime运行时,动态的赋值/取值。简单来说,具体实现如下:












a. setValue:forKey的搜索方式:



1. 首先搜索set<Key>:方法


如果成员用@property,@synthsize处理,因为@synthsize告诉编译器自动生成set<Key>:格式的setter方法,所以这种情况下会直接搜索到。


注意:这里的<Key>是指成员名,而且首字母大写。下同。


2. 上面的setter方法没有找到,如果类方法accessInstanceVariablesDirectly返回YES(注:这是NSKeyValueCodingCatogery中实现的类方法,默认实现为返回YES)。


那么按_<key>,_is<Key>,<key>,is<key>的顺序搜索成员名。



3. 如果找到设置成员的值,如果没有调用setValue:forUndefinedKey:。




b. 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<Key>: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:。



版权声明:本文为cewei711原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。