KVO

2022-09-02  本文已影响0人  Keeping汤

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);
}
上一篇 下一篇

猜你喜欢

热点阅读