美文网首页
KVO底层实现原理

KVO底层实现原理

作者: 是超超呀 | 来源:发表于2021-04-27 16:17 被阅读0次

KVO的本质

key-value observer,键值监听,对某一个实例对象进行该实例对象某一个属性值的监听addObserver:forKeyPath:options:content:对象添加监听的方法

参数

observer,需要谁(实例对象)来监听

keyPath,需要监听的属性名称 不是所有的属性都可以监听

options,监听该属性的方式 新值 / 旧值

content,携带值,一般为nil

KVO 不会对self进行强引用,如果观察者的生命周期结束了,self被释放,所以添加的监听需要被移除。

iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)

利用RuntimeAPI动态生成一个子类NSKVONotifying,并且让instance对象的isa指向这个全新的子类,当修改instance对象的属性时,会调用Foundation的_NSSetXXXValueAndNotify函数willChangeValueForKey:

父类原来的setter

didChangeValueForKey:

内部会触发监听器(Oberser)的监听方法(observeValueForKeyPath:ofObject:change:context:)

如何手动触发KVO?

手动调用willChangeValueForKey:和didChangeValueForKey:

KVO

kvo

未使用KVO监听的对象

实例对象的isa指针指向类对象,因为类对象在内存中存储的信息有isa指针,superclass,属性,对象方法,协议,成员变量等,因此可以在类对象中找到对象方法,进行调用。
使用了KVO监听的对象

当一个实例对象调用添加监听属性的方法时,实际上是runtime动态创建了一个名为“NSKVONotifying_Person类名”的类,该类会继承与person类,并且让该实例对象的isa指针重新指向了这个动态创建的类的类对象。因此在该实例对象属性修改值的时候,实际上在内存中该实例对象通过isa指针找到了动态创建的这个子类的类对象,这个动态的类对象中重写了属性的set方法,只是这个动态类的set方法实现并不是直接修改该属性的值,而是调用了一个名叫 “_NSSetIntValueAndNotify的C方法。

_NSSetIntValueAndNotify方法的内部实现,相当于在调用原来的set方法实现之前,加入 willChangeValueForKey,在其方法后,加入didChangeValueForKey,以此来记录属性的新值和旧值。然后在重写didChangeValueForKey方法中,通过调用 observer的observerValueForKeyPath:ofObject:change:content方法通知监听者。

NSSetxxxValueAndNotify内部实现

直接修改成员变量会触发KVO吗?

不会 因为没有调用set方法,KVO的本质就是重写set方法

相关文章

  • Today面试

    Runloop 底层原理Kvo 底层原理ARC 底层原理 如何实现GCD 底层原理Block 底层原理Aut...

  • IOS底层(三) KVO底层实现原理

    @[TOC](IOS底层(三) KVO底层实现原理 ) 一,KVO简述 KVO的全称 Key-Value Obse...

  • iOS - KVO

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

  • KVO的底层实现原理

    KVO的底层实现原理
    KVO的定义(Key-Value Observing) ...

  • iOS - 自定义KVO

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

  • iOS开发面试攻略(KVO、KVC、多线程、锁、runloop、

    KVO & KVC KVO用法和底层原理 使用方法:添加观察者,然后怎样实现监听的代理 KVO底层使用了 isa-...

  • 底层原理

    iOS底层原理总结 - Category的本质 KVO详解及底层实现青少年一定要读的KVO指南 iOS 底层解析w...

  • 2018-02-14

    探究KVO的底层实现原理 addObserver:forKeyPath:options:context:各个参数的...

  • 关于KVO底层Runtime实现的那点事

    有很多公司iOS面试都会被问到KVO底层的实现。网上也有很多篇关于KVO的底层原理,但是都是用willChange...

  • iOS --- KVO

    KVO 的底层实现原理 (1)KVO 是基于 runtime 机制实现的 (2)假如有个对象DoLin(类型为Do...

网友评论

      本文标题:KVO底层实现原理

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