美文网首页
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