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