美文网首页
iOS KVC赋值内部实现

iOS KVC赋值内部实现

作者: XLsn0w | 来源:发表于2020-07-22 14:12 被阅读0次
[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:

方法, 然后抛出异常

相关文章

网友评论

      本文标题:iOS KVC赋值内部实现

      本文链接:https://www.haomeiwen.com/subject/pdnzkktx.html