美文网首页底层
KVC底层流程

KVC底层流程

作者: 猿人 | 来源:发表于2020-10-10 17:02 被阅读0次
    KVC.jpg

    valueForKey:

    • 给定一个key作为输入

    • 搜索实例方法顺序:get<Key>,<key>,is<Key>或者_<Key>

    • 找到: 检查属性值是否是对象指针
      : 返回结果
      :判断是否是所支持的标量类型 NSNumber
      ---- : 将其存储在NSNumber实例中返回
      ---- :则将其转换为NSValue对象并返回

    • 未找到:在实例中搜索下面三个方法
      1: countOf<Key>
      2: objectIn<Key>Atindex:(与NSArray类定义的原始方法<key>Atindexes:向对应)
      3: objectsAtindexes:(与该NSArray方法相对应相匹配的方法)
      ------ 如找到其中一个以及其他两个中的至少一个,则创建一个响应所有NSArray方法的集合代理对象将其返回。
      ------ 如未找到则再次查找下面三组方法
      1: countOf<Key>
      2: enumeratorOf<Key>:
      3: memberOf<Key>:(对应于NSSet类定义的原始方法)
      ------ 如这三个方法都找到了创建一个集合代理对象它响应所有的NSSet方法并返回
      ------ 未找到(简单的访问方法或集合访问方法组)查看接受方的类方法+(BOOL)accessInstanceVariablesDisrectly返回的YES NO

    • +(BOOL)accessInstanceVariablesDisrectly
      YES: 则按照顺序搜索一个实例变量:_<Key> , _is<Key>,<Key> ,或is<Key>.
      ------如找到:直接获取实例变量。
      ------未找到:调用valueForUndefinedKey:方法,查找完成。默认会崩溃 但是NSObject的子类可能会重写此方法提供特定于键的行为。
      NO:则调用valueForUndefinedKey:方法,查找完成。默认会崩溃 但是NSObject的子类可能会重写此方法提供特定于键的行为

    setValue:forKey:

    • 给定键 和值作为参数输入,尝试在接受调用的对象内部设置一个名为Key的属性 value(或者,对于费对象属性,为value的解包装版本,如面熟的非对象值)
    • 按照顺序查找 set<Key>:_set<Key>:
      找到:输入值(或根据需要解包的值)调用它并完成
      未找到:查看 +(BOOL)accessInstanceVariablesDisrectly返回 YES NO
    • +(BOOL)accessInstanceVariablesDisrectly
      YES:顺序查找_<Key>,_is<Key>,<Key>,或者is<Key>
      ------ 找到:直接输入值(或者展开值)设置变量并完成
      ------ 未找到:调用 setValue:forUndefinedKey: 默认情况差生异常
      NO: 调用 setValue:forUndefinedKey: 默认情况差生异常

    相关文章

      网友评论

        本文标题:KVC底层流程

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