KVC/KVO

作者: 阿狸小朋友 | 来源:发表于2020-08-24 11:54 被阅读0次

    1.KVC赋值

    赋值
    • 查看setKey:方法是否存在, 如果存在直接调用

    • 查看_setKey:方法是否存在, 如果存在直接调用

    • 查看+ (BOOL)accessInstanceVariablesDirectly方法的返回值, 默认返回YES

      • YES: 可以访问成员变量, 进入下一步
      • NO: 不可以访问成员变量, 同时调用- (void)setValue:(id)value forUndefinedKey:(NSString *)key方法, 如果方法不存在会抛出异常
    • 调用成员变量:_key, _isKey, key, isKey

    • 调用顺序, 从左到右, 只有发现存在成员变量, 就不会在调用后续变量
      如果没有成员变量, 会调用- (void)setValue:(id)value forUndefinedKey:(NSString *)key方法, 如果方法不存在会抛出异常


    • 附加知识: setValuesetObject的区别
    NSMutableDictionary特有的方法
    key不为nil的所有继承NSCopying的类型
    value不可以为nil
    - (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;
    
    KVC的主要方法
    key必须是不为nil的字符串类型
    value是可以为nil的
    - (void)setValue:(nullable ObjectType)value forKey:(NSString *)key;
    

    2.KVC取值

    取值
    • 判断是否有这几个方法: getKey, key, isKey, _key 从左到右, 如果有方法直接调用, 取值结束
      • 如果没有,调用+ (BOOL)accessInstanceVariablesDirectly查看是否可以访问成员变量. 默认YES
      • YES: 可以访问成员变量
      • NO: 不可以访问成员变量, 判断是否实现- (id)valueForUndefinedKey:(NSString *)key方法, 实现时调用, 未实现报错
    • 判断是否有这几个成员变量:_key, _isKey, key, isKey从左到右, 如果有成员变量, 直接访问, 取值结束

    相关文章

      网友评论

          本文标题:KVC/KVO

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