iOS - KVO

作者:Mitchell 

一 、简介

  • 全称:Key Value Observing(键值监听),也就是每次对象的属性被改变后,那么监听者就会接到通知,是一个很常用的开发模式。

二、作用

  • 监听模型的属性值的改变

三、步骤

  • 添加监听器
    // 利用b对象来监听a对象name属性的改变
    [a addObserver:b forKeyPath:@"name" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:@"test"];
    
  • 在监听器中实现监听方法
    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change     context:(void *)context
    {
        NSLog(@"%@ %@ %@ %@", object, keyPath, change, context);
    }
    
  • 选择不监听某个属性
//通知 key 的观察者
+(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key{
    //不观察这个 key
    if ([key isEqualToString:@"link"]) {
        return NO;
    }
    //调用系统的方法
    return [super automaticallyNotifiesObserversForKey:key];
}

四、KVO 实现原理

  • 根据苹果文档中的话:

自动的键值观察技术使用 isa-swizzling 的技术来实现。当一个观察者开始观察一个对象的属性的时候,被观察对象的 isa 指针就被修改了,指向了一个中间类而不是原来的类。

  • 简单叙述 KVO 的实现,当观察一个对象的时候,一个新的类会被动态创建出来。这个类继承自该对象的原本的类,并重写了被观察属性的 setter 方法。新的方法会在原来的 setter 方法之前和之后,通知所有观察对象值的更改。然后把这个对象的 isa 指针指向这个中间类。不仅如此,苹果还重写了-class 的方法,让开发者看起来使用的仍旧是原来的类。

参考链接:如何自己动手实现 KVO

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