当调用setValue:属性值 forKey:@”name“的代码时,底层的执行机制如下:
程序优先调用set:<Key>属性值方法,代码通过setter方法完成设置,如果没有找到setName:方法,KVC机制会检查+ (BOOL)accessInstanceVariablesDirectly方法有没有返回YES,默认该方法会返回YES,如果你重写了该方法让其返回NO的话,那么在这一步KVC会执行setValue:forUNdefinedKey:方法。
如果该类即没有set<Key>:方法,也没有_<Key>和_is<Key>成员变量,KVC机制再会继续搜索<Key>和is<Key>的成员变量。再给它们赋值。
如果上面列出的方法或者成员变量都不存在,系统将会执行该对象的setValue:forUNdefinedKey:方法,默认是抛出异常。
当调用ValueforKey:@”name“的代码时,KVC对key的搜索方式不同于setValue:属性值 forKey:@”name“,其搜索方式如下
首先按get<Key>,<Key>,is<Key>的顺序方法查找getter方法,找到的话会直接调用。如果是BOOL或者int等值类型, 会做NSNumber转换
会按_<Key>,_is<Key>,,is<Key>的顺序搜索成员变量名