KVC原理

作者: erlich | 来源:发表于2022-06-26 21:36 被阅读0次

    描述

    Key-value coding is a mechanism enabled by the NSKeyValueCoding informal protocol that objects adopt to provide indirect access to their properties.

    kvc 是由NSKeyValueCoding非正式协议采用的一种机制,对象通过该协议来提供属性的间接访问

    image.png image.png

    执行结果为

    IFLArchitecture[15333:450053] -[IFLKVCObject setName:] -- name: kvc_name1
    

    根据测试,发现 setValue forKey, 会先判断是否含有setName, 有的话执行 setName

    否则,判断有无 _setName ,有的话执行 _setName

    如果 key不存在的话,

    执行 - (void)setValue:(id)value forUndefinedKey:(NSString *)key
    

    accessInstanceVariablesDirectly

    image.png image.png image.png

    如果 accessInstanceVariablesDirectly 返回YES

    则 setValue forKey 根据 _<key> _is<Key> <key> is<Key> 的顺序查找变量进行设置

    如果 accessInstanceVariablesDirectly 返回NO

    则 setValue forKey 将执行 setValue: forUndefinedKey:

    现在把set的方法全都注释掉,看下成员变量 name们的值

    image.png image.png image.png image.png

    发现就 _name有值

    注释掉 _name 继续测试

    image.png image.png

    此时 _isName 有值

    注释掉 _isName 继续测试

    image.png image.png

    此时 name 有值

    注释掉 name 继续测试

    image.png image.png

    此时 isName有值

    set方法的执行顺序

    image.png

    如果我们通过注释测试,发现

    set执行顺序为 set<Key> _set<Key> setIs<Key>

    value设置的顺序为 _<key> _is<Key> <key> is<Key>

    get方法执行顺序

    image.png image.png image.png

    注释掉 set get

    image.png image.png

    取值结果为null

    因为取值顺序为 _<key> _is<Key> <key> is<Key>

    自定义KVC流程

    自定义实现说白了就是对前面 key的拼接 大小写处理 判断方法实现

    自定义setValue forKey

    image.png
    • 顺序判断set<Key> _set<Key> setIs<Key> 是否实现

    • 判断 accessInstanceVariablesDirectly 是否允许直接访问实例变量

    • 顺序查找 _<key> _is<Key> <key> is<Key> 实例变量

    • object_setIvar 实例变量赋值

    image.png

    自定义 getValueForKey 与 set大同小异

    image.png

    kvc自定义实现代码

    相关文章

      网友评论

        本文标题:KVC原理

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