KVO 的实现原理

作者: 逍遥晨旭 | 来源:发表于2017-08-22 14:49 被阅读210次

概述

KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则其观察者就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

KVO其实也是“观察者”设计模式的一种应用。这种模式有利于两个类间的解耦合,尤其是对于 业务逻辑与视图控制 这两个功能的解耦合。

KVO 的具体使用

/**
 KVO是监听对象的属性值的改变的
 @param self.person 被检测的对象
 @param self  检测的对象
 @param @"name"  要监控的属性
 @param options:  设置通知类型 
 */
 [self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];

//被检查对象的值发生改变会调用该方法,这个方法属于 NSObject 类的,任何对象都可以作为观察者,
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
    NSLog(@"监听到了%@的%@属性发生了改变", object, keyPath);
    NSLog(@"%@", change);
}

KVO 的实现原理

KVO 是基于运行时实现的

isa Class   NSKVONotifying_Person   0x000001a12de2f545

上述例子中,当 person.name 的值改变时, person对象的 isa 指针会指向 NSKVONotifying_Person,意味着,在程序运行时,会动态生成一个 NSKVONotifying_Person 类,该类继承于 Person,而且该类中也有个 -setName: 方法,方法中在设置 name 的同时实现了:

- (void)setName:(NSString *)name
{
    [super setName:name];

    // 这两个方法底层会调用observer的- (void)observeValueForKeyPath: ofObject: change: context:这个方法
    [self willChangeValueForKey:@"name"];
    [self didChangeValueForKey:@"name"];
}

相关文章

  • iOS KVO

    KVO 示例 KVO的实现原理

  • 常见面试题--KVC和KVO

    1、KVO实现原理 2、KVC原理

  • 知识集锦

    https://github.com/starainDou 欢迎点星 KVO实现原理 KVO基本原理: 1 kvo...

  • iOS - 自定义KVO

    之前我们已经了解过了KVO的底层实现原理,不过呢,在我们开始实现自定义KVO之前再来简单回顾下KVO的实现原理 1...

  • iOS - KVO

    [toc] 参考 KVO KVC 【 iOS--KVO的实现原理与具体应用 】 【 IOS-详解KVO底层实现 】...

  • iOS原理篇(一): KVO实现原理

    KVO实现原理 什么是 KVO KVO 基本使用 KVO 的本质 总结 一 、 什么是KVO KVO(Key-Va...

  • iOS高级进阶之KVO

    KVO的原理 分析原理 使用 手动调用 自己实现KVO NSObject+KVOBlock.h NSObject+...

  • iOS 自定义KVO

    通过在了解KVO的实现原理和实现步骤之后,我们可以手动实现KVO,具体可以看最后的demo,这里只讲实现原理 添加...

  • iOS 进阶原理知识笔记

    KVO实现原理 KVO基本原理: 1 kvo是基于runtime机制实现的 2 当某个类的属性对象第一次被观察时,...

  • iOS 进阶原理知识随笔

    KVO实现原理 KVO基本原理: 1 kvo是基于runtime机制实现的 2 当某个类的属性对象第一次被观察时,...

网友评论

    本文标题:KVO 的实现原理

    本文链接:https://www.haomeiwen.com/subject/xuyoxxtx.html