KVO与KVC

作者: DB001 | 来源:发表于2020-04-02 16:53 被阅读0次

一、KVO

KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变。
kvo-1.png
  • 没有使用KVO监听的对象


    kvo-2.png
  • 使用了KVO监听的对象
    kvo-3.png
    _NSSet*ValueAndNotify的内部实现
    kvo-4.png
kvo相关面试题
一、iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)
1、利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类
2、当修改instance对象的属性时,会调用Foundation的_NSSetXXXValueAndNotify函数
 ->willChangeValueForKey:
 ->父类原来的setter
 ->didChangeValueForKey:
内部会触发监听器(Oberser)的监听方法( observeValueForKeyPath:ofObject:change:context:)

二、如何手动触发KVO?
->:手动调用willChangeValueForKey:和didChangeValueForKey:

三、直接修改成员变量会触发KVO么?
->:不会触发KVO

四、通过KVC修改属性会触发KVO么?
->:会触发KVO

二、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:的原理

    kvc-1.png
    accessInstanceVariablesDirectly方法的默认返回值是YES
  • valueForKey:的原理


    kvc-2.png

相关文章

网友评论

      本文标题:KVO与KVC

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