KVO的笔记

95 阅读1分钟

大佬链接 详情分析

  • Person 类
@interface Person : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)NSInteger age;
@end
@implementation Person

- (instancetype)init
{
    self = [super init];
    if (self) {
        NSLog(@"%@",[self class]);
    }
    return self;
}

- (void)willChangeValueForKey:(NSString *)key
{
    [super willChangeValueForKey:key];
    NSLog(@"%s",__FUNCTION__);
}

- (void)didChangeValueForKey:(NSString *)key
{
    [super didChangeValueForKey:key];
    NSLog(@"%s",__FUNCTION__);

}
  • 设置监听
self.person = [[Person alloc] init];
self.person.name = @"aaa";

self.person2 = [[Person alloc] init];
self.person2.name = @"roy";

// 注册观察者
NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;
[self.person addObserver:self forKeyPath:@"name" options:options context:@"111"];
// 当监听对象的属性值发生改变时就会调用
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    NSLog(@"监听对象:%@ - 属性%@ - %@ %@",object,keyPath,change,context);
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    self.person2.name = @"Captain";

    [self.person willChangeValueForKey:@"name"];
    self.person.name = @"ccc";
    [self.person didChangeValueForKey:@"name"];
}

-(void)dealloc
{
    // 移除监听
    [self.person removeObserver:self forKeyPath:@"name"];
}
  • 当属性值没有改变监听不会打印,可以通过如下设置监听
[self.person willChangeValueForKey:@"name"];
self.person.name = @"ccc";
[self.person didChangeValueForKey:@"name"];