美文网首页OC原理知识
KVO - KVC 从根本原理透析

KVO - KVC 从根本原理透析

作者: MrBMask | 来源:发表于2018-08-15 21:43 被阅读0次

    一.KVO

    KVO的全称为Key-Value Observing,也就是我们常说的键值监听。通过KVO我们可以监听某个对象的属性的改变

    1.KVO的使用

    1.给对象添加KVO监听

    NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;
        [self.person addObserver:self forKeyPath:@"age" options:options context:@"context"];
    

    2.当监听对象的属性值发生改变的时候会调用下面的方法

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
    {
        NSLog(@"监听到%@的%@属性值改变了 - %@ - %@", object, keyPath, change, context);
    }
    

    3.当内存销毁的时候移除KVO监听

    - (void)dealloc {
       [self.person removeObserver:self forKeyPath:@"age"];
    }
    

    2.KVO的本质

    • KVO的本质其实是利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类。
    • 所以当我们修改instance对象的属性时,会调用Foundation的_NSSetXXXValueAndNotify函数,即:
      . willChangeValueForKey:
      . 父类原来的setter
      .didChangeValueForKey:
      接下来内部会触发监听器(Oberser)的监听方法(observeValueForKeyPath:ofObject:Change:Context:)

    面试问题:

    • 如何手动出发KVO
      只要手动调用willChangeValueForKey和didChangeValueForKey:方法即可

    • 直接修改成员变量会触发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;

    相关文章

      网友评论

        本文标题:KVO - KVC 从根本原理透析

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