2-5KVO

KVO [重写setter 方法 来实现的]

重写他的setter 方法。来 通知所有的观察对象
所以说kvo是用在没法用set方法的地方,比如一些类的私有属性进行修改

原理。ISA Swizzling

KVO是OC对观察者模式的又一实现
苹果通过isa混写技术来实现KVO

当我们给某一个类的属性添加观察者的时候。比如A类

苹果会给我们创建一个新的类 NCKVONotifying_A 的类 它是A的一个子类

    MObject *obj = MObject.new;
    MObjectObserver *server = MObjectObserver.new;
    
    [obj addObserver:server forKeyPath:@"value" options:NSKeyValueObservingOptionNew context:NULL];
    
    obj.value = @"1";

(lldb) po object_getClassName(obj)
"MObject"

(lldb) po object_getClassName(obj)
"NSKVONotifying_MObject"

系统给我们添加了一个子类

Setter 里面调用的方法. [super setValue:value];父类方法

- (void)setValue:(id)value {
    [self willChangeValueForKey:@"keyPath"];
    [super setValue:value];
    [self didChangeValueForKey:@"keyPath"];
}

如何触发?

1.直接调用set方法
2.实用KVC。---> 会调用setter方法
3.手动实现。赋值之前调用 willChangeValueForKey  之后调用  didChangeValueForKey
4.直接给成员变量赋值 不会触发KVO

直接给成员变量赋值是否会出发KVO呢?

不会。没有调用set方法 如何实现呢?
    [self willChangeValueForKey:@"age"];
    self->age = 100;
    [self didChangeValueForKey:@"age"];

你可能感兴趣的:(2-5KVO)