iOS面试题-KVC的底层原理

486 阅读1分钟

KVC

  • KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性
  • 常见的API有以下几个
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
- (id)valueForKey:(NSString *)key; 

setValue:forKey:的原理

image.png

value:forKey:的原理

image.png

面试题

  • 通过KVC修改属性会触发KVO么?

    • 会触发KVO, 相当于KVC内部会去手动调用willChangeValueForKey:didChangeValueForKey:方法
    • KVC 对属性赋值时候 是会在这个类里边 去查找 _key isKey setKey setIsKey 等方法的 ,最终会调用属性的 setter 方法 ,那么如果添加了 KVO 还是会被触发的.相反 设置成员变量 _key 由于不会触发 setter 方法 ,因此不会去触发 KVO 相关的代码 .
  • KVC的赋值和取值过程是怎样的?原理是什么?

    • 把上面两张图的流程大概说一下
    • 没找到方法,判断accessInstanceVariablesDirectly的返回值,默认是YES
      • 如果是NO,会调用ValueForUndefineKey并抛出异常
      • 如果是YES,会按下面的顺序去调用
    • 顺序 _key, _isKey, key, isKey