KVC原理

作者: HChase | 来源:发表于2019-07-15 20:08 被阅读0次

    KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性。

    常用的KVC方法

    • set:
      1. setValue:( id)value forKey:(NSString *)key;
      2. setValue:( id)value forKeyPath:(NSString *)key;
    • get:
      1. valueForKey:(NSString *)key;
      2. valueForKeyPath:(NSString *)key;

    setValue:forKey:的原理

    调用原理
    调用 setValue:forKey: 方法:
    • 首先查找方法,按顺序查找 setKey:、_setKey: ,如果找到就传递参数,调用方法,完成kvc操作;
    • 如果找不到方法,查看 accessInstanceVariablesDirectly 方法(默认返回值为YES)是否返回值为YES;如果是YES,说明可以查找成员变量,按顺序查找成员变量 _key、_isKey、key、isKey,如果找到直接赋值;
    • 否则都将会调用 setValue: forUndefinedKey:,并抛出 NSUnknownKeyException 异常;

    valueForKey: 的原理

    调用原理

    调用 valueForKey: 方法:

    • 首先查找方法,按照顺序查找 getKey、key、isKey、_key,如果找到直接返回结果;
    • 如果找不到方法,查看 accessInstanceVariablesDirectly 方法(默认返回值为YES)是否返回值为YES;如果是YES,说明可以查找成员变量,按顺序查找成员变量 _key、_isKey、key、isKey,如果找到直接赋值;如果找到就取值;这个步骤和setValue:forKey: 相似
    • 否则都将会调用 valueForUndefinedKey: ,并抛出 NSUnknownKeyException 异常;

    应用

    kvc赋值,可以响应kvo回调

        // 添加KVO监听
        [person addObserver:observer forKeyPath:@"age" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];
        
        // 通过KVC修改age属性
        [person setValue:@10 forKey:@"age"];
    
        // 移除KVO监听
        [person removeObserver:observer forKeyPath:@"age"];
    

        // 添加KVO监听
        [person addObserver:observer forKeyPath:@"age" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];
        
        // 通过KVC修改age属性
        // 添加KVO监听
        [person addObserver:observer forKeyPath:@"age" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];
        
        // 通过KVC修改age属性
        [person willChangeValueForKey:@"age"];
        person->_age = 10;
        [person didChangeValueForKey:@"age"];
        
        // 移除KVO监听
        [person removeObserver:observer forKeyPath:@"age"];
    

    打印:

    observeValueForKeyPath - {
        kind = 1;
        new = 10;
        old = 0;
    }
    

    相关文章

      网友评论

          本文标题:KVC原理

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