KVC原理

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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。