美文网首页
KVO实现原理

KVO实现原理

作者: 爱学的小姚 | 来源:发表于2021-11-02 19:12 被阅读0次

1、KVO是什么

KVO(Key-Value Observing),俗称键值监听,用于监听某个对象属性的改变

2、KVO的使用

调用KVO的监听方法:

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;

并且实现KVO方法:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
}

3、实现原理

根据demo,我们自定义的类KVOObject,包含一个count属性,当我们监听self.objc对象属性的时候,发现self.objc->isa指向的是一个全新的类:NSKVONotifying_KVOObject

image.png
当我们监听对象属性的时候,实际上是通过监听对象的setter方法,当我们使用KVO监听之前,self.objc对象的isa指针指向的是KVOObject对象,增加KVO监听之后,runtime会动态地将我们的self.objc指向一个新创建的临时类NSKVONotifying_KVOObject,当我们监听对象某个属性的时候,实际上是重新setter方法,伪代码实现为:

- (void)setCount:(NSInteger)count {
    [self willChangeValueForKey:@"count"];
    [super setCount:count];
    [self didChangeValueForKey:@"count"];
}

- (void)didChangeValueForKey:(NSString *)key {
    [observe observeValueForKeyPath:key ofObject:self change:change context:context];
}

结论:KVO实现原理

利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类
当修改instance对象的属性时,会调用Foundation_NSSetXXXValueAndNotify函数,然后执行:
1、willChangeValueForKey:
2、父类原来的setter
3、didChangeValueForKey:,其内部会触发监听器(Oberser)的监听方法( observeValueForKeyPath:ofObject:change:context:

相关文章

  • 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/clrialtx.html