KVO/KVC

作者: Li_Po | 来源:发表于2020-10-15 10:36 被阅读0次

    KVO是key-value observing的缩写
    kvo是object-c对观察者模式的又一实现
    apple使用了isa混写(isa-swizzling)来实现kvo

    image.png

    //调用kvo方法监听obj的value属性的变化

    • [obj addObserver:observer forKeyPath:@"value" options:NSKeyValueObservingOptionNew context:NULL];

    //监听到变化回调

    • (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
      if ([object isKindOfClass:[MObject class]] &&
      [keyPath isEqualToString:@"value"]) {
      //获取value的新值
      NSNumber *valueNum = [change valueForKey:NSKeyValueChangeNewKey];
      NSLog(@"value is %@", valueNum);
      }
      }

    //使用setter方法改变值kvo会生效
    //使用setValue:forKey改变值kvo会生效
    //成员变量直接赋值需要手动添加kvo才会生效

    • (void)increase
      {
      //直接为成员变量赋值
      [self willChangeValueForKey:@"value"];
      _value += 1;
      [self didChangeValueForKey:@"value"];
      }

    KVC

    kvc是key-value coding的缩写

    • -(nullable id)valueForKey:(NSString *)key;
    • -(void)setValue:(nullable id)value forKey:(NSString *)key;

    kvc键值编码技术会破坏面向对象编程思想,通过accessInstanceVariablesDirectly返回NO来支持面向对象思想(默认返回yes)

    调用valueForKey先判断有没有实现get方法(访问器方法是否存在?getKey/key/isKey),没有就去判断有没有对应的实例变量(同名或相识:_key/_isKey/key/isKey),再没有会抛出未定义key的异常


    image.png

    调用setValue:forKey


    image.png

    相关文章

      网友评论

          本文标题:KVO/KVC

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