OC语法(KVC)

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

常用的Api有:

// 通过key来设置instance对象的属性的值
- (void)setValue:(id)value forKey:(NSString *)key;
// 通过keyPath来设置instance对象的属性的值的值(有个对象cat是instance对象的属性,该对象有个属性high),keyPath为@"cat.high"
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forUndefinedKey:(nonnull NSString *)key;
// 通过key来获得instance对象的属性的值
- (id)valueForKey:(NSString *)key;
// 同理keyPath
- (id)valueForKeyPath:(NSString *)keyPath;
- (id)valueForUndefinedKey:(NSString *)key;

G、题:通过KVC修改属性会触发KVO吗?

答:会触发KVO的。虽然说如果没有写属性,使用代码直接给成员变量赋值是不会触发KVO的,但是,如果使用KVC修改成员变量的值,是会触发KVO的。这是KVC的内部机制所导致的(KVC内部调用了手动触发KVC的机制即willChangeValueForKeydidChangeValueForKey)。在didChangeValueForKey的里面触发KVO监听。


H、题:KVC赋值和取值过程是怎样的?原理是什么?

答:

setValue:forKey:的赋值原理:
  1. 按照setKey:_setKey的顺序查找方法;
  2. 如果找到方法,则传递参数,调用方法;
  3. 如果没找到方法,则查看accessInstanceVariablesDirectly方法的返回值;
  4. 如果返回值为NO,则会调用setValue:forUndefinedKey:方法,并抛出异常,NSUnknownKeyException
  5. 如果返回值为YES,则按照_key -> _isKey -> key -> isKey 的顺序查找成员变量;
  6. 如果查找到了上述4个中的一个,直接赋值;
  7. 如果都没找到,则会调用setValue:forUndefinedKey:方法,并抛出异常,NSUnknownKeyException

注意:accessInstanceVariablesDirectly这个方法的默认返回值为YES

valueForKey:的取值原理:
  1. 按照getKey:keyisKey_key的顺序查找方法;
  2. 如果找到方法,则直接调用方法;
  3. 如果没找到方法,则查看accessInstanceVariablesDirectly方法的返回值;
  4. 如果返回值为NO,则会调用valueForUndefinedKey:方法,并抛出异常,NSUnknownKeyException
  5. 如果返回值为YES,则按照_key -> _isKey -> key -> isKey 的顺序查找成员变量;
  6. 如果查找到了上述4个中的一个,直接取值;
  7. 如果都没找到,则会调用valueForUndefinedKey:方法,并抛出异常,NSUnknownKeyException

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

推荐阅读更多精彩内容

  • KVC KVC定义 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过K...
    暮年古稀ZC阅读 2,169评论 2 9
  • KVC(Key-valuecoding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iOS...
    榕樹頭阅读 723评论 0 2
  • KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iO...
    朽木自雕也阅读 1,580评论 6 1
  • 关于键值编码 键值编码(KVC)是一种由NSKeyValueCoding非正式协议提供的机制,对象采用该机制来提供...
    渐z阅读 955评论 0 0
  • 简介 KVC(Key-value coding)键值编码,翻译一下就是指iOS的开发中,可以允许开发者通过Key名...
    6ffd6634d577阅读 1,329评论 1 9