KVO/KVC

2020-10-15  本文已影响0人  Li_Po

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

image.png

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

//监听到变化回调

  • (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的缩写

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

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


image.png

调用setValue:forKey


image.png
上一篇 下一篇

猜你喜欢

热点阅读