KVO,即iOS开发中的观察者模式。
假设有以下类结构:
@interface ATObserveObject : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
当实例化对象后,对属性添加观察者,如下
- (void)testObserve {
_aObject = [ATObserveObject new];
_bObject = [ATObserveObject new];
[_aObject addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
_aObject.name = @"hello";
[_bObject addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
_bObject.age = 18;
}
在首次添加观察者时,系统会自动生成ATObserveObject 的子类NSKVONotifying_ATObserveObject,同时实例对象的isa指针指向类NSKVONotifying_ATObserveObject,
image.png
并重写被监听属性的setter方法,如下
-(void)setName:(NSString *)name {
[self willChangeValueForKey:name];
_name = name;
[self didChangeValueForKey:name];
}
当被监听的属性值发生变化时,会触发如下方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
NSLog(@"%@",change);
}