KVC底层原理

1.赋值时的调用顺序:
当调用setValue:属性值 forKey:@”name“的代码时,底层的执行机制如下:
程序有限调用setName:方法,代码通过name的setter方法完成设置;
如果没有找setName:方法,KVC会检查+ (BOOL)accessInstanceVariablesDirectly是否返回未YES,默认会返回YES,如果重写该方法返回NO的话,那么在这一步KVC会执行setValue:forUndefinedKey:方法,不过一般都不这么做.返回YES之后,KVC机制会搜索该类里边有没有_name的成员变量,如果有就赋值;
如果该类既没有setName:,也没有_name,KVC就会搜索_isName的成员变量;
如果没有setName:方法,也没有_name和_isName成员变量,KVC会继续搜索name和isName变量,然后赋值;
如果以上方法或者成员变量都不存在,系统将会执行该对象的setValue:forUndefinedKey:方法,默认是抛出异常。

2.取值时
首先会按getName,name,isName的顺序查找getter方法,找到的话会直接调用;
如果上边没找到,KVC则会查找countOfName,objectInNameAtIndex或nameAtIndexes格式的方法。如果countOfName方法和另外两个方法中的一个被找到,那么就会返回一个可以响应NSArray所有方法的代理集合(它是NSKeyValueArray,是NSArray的子类),调用这个代理集合的方法,或者说给这个代理集合发送属于NSArray的方法,就会以countOfName,objectInNameAtIndex或nameAtIndexes这几个方法组合的形式调用。还有一个可选的getName:range:方法。所以你想重新定义KVC的一些功能,你可以添加这些方法,需要注意的是你的方法名要符合KVC的标准命名方法,包括方法签名;
如果上面的方法没有找到,那么会同时查找countOfName,enumeratorOfName,memberOfName格式的方法。如果这三个方法都找到,那么就返回一个可以响应NSSet所的方法的代理集合,和上面一样,给这个代理集合发NSSet的消息,就会以countOfName,enumeratorOfName,memberOfName组合的形式调用。

你可能感兴趣的:(KVC底层原理)