[self setValue:@"Mark" forKey:@"name"];
程序优先调用set<Key>:属性值方法,代码通过setter方法完成设置。
这里的<key>是指成员变量名,setName
首字母大小写要符合KVC的命名规则,下同。
如果没有找到setName:方法,
KVC机制会检查+ (BOOL)accessInstanceVariablesDirectly方法有没有返回YES,默认该方法会返回YES,如果你重写了该方法让其返回NO的话,那么在这一步KVC会执行setValue:forUndefinedKey:方法
不过一般开发者不会这么做。所以KVC机制会搜索该类里面有没有名为<key>的成员变量,无论该变量是在类接口处定义,还是在类实现处定义,也无论用了什么样的访问修饰符,只在存在以<key>命名的变量,KVC都可以对该成员变量赋值。
如果该类既没有set<key>:方法setName,
也没有_<key>成员变量_name,
KVC机制会搜索_is<Key>的成员变量_isName
和上面一样,如果该类即没有set<Key>:方法,
也没有_<key>和_is<Key>成员变量,
KVC机制再会继续搜索<key>和is<Key>的成员变量。再给它们赋值。
name isName
如果上面列出的方法或者成员变量都不存在,
系统将会执行该对象的setValue:forUndefinedKey:方法,默认是抛出异常。
如果开发者想让这个类禁用KVC里,那么重写
+ (BOOL)accessInstanceVariablesDirectly {
return NO;
}
方法让其返回NO即可,
这样的话如果KVC没有找到set<Key>:属性名时,会直接用
setValue:forUndefinedKey:
方法, 然后抛出异常
网友评论