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"];