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