iOS KVO内部实现原理

作者: _那有只喵 | 来源:发表于2016-09-23 10:04 被阅读191次

KVO基本概念:主要用来监听某个对象的某个属性的变化,当发生变化的时候,观察者会调用对应的函数,实现对应的功能。

KVO是基于runtime机制实现的

当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter 方法。派生类在被重写的setter方法内实现真正的通知机制

如果原类为Person,那么生成的派生类名为NSKVONotifying_Person

每个类对象中都有一个isa指针指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法

键值观察通知依赖于NSObject 的两个方法: willChangeValueForKey: 和 didChangevlueForKey:;在一个被观察属性发生改变之前, willChangeValueForKey: 一定会被调用,这就 会记录旧的值。而当改变发生后,didChangeValueForKey: 会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用。

补充:KVO的这套实现机制中苹果还偷偷重写了class方法,让我们误认为还是使用的当前类,从而达到隐藏生成的派生类

以下是图解释:

相关文章

  • iOS - KVO

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

  • iOS面试题03-Foundation(★★★)

    《2018 iOS面试题系列》 一、KVO内部实现原理 KVO是基于runtime机制实现的 当某个类的对象第一次...

  • iOS KVO内部实现原理

    KVO基本概念:主要用来监听某个对象的某个属性的变化,当发生变化的时候,观察者会调用对应的函数,实现对应的功能。 ...

  • iOS面试题(4) KVO KVC

    声明,不是原创,笔记均来自 群主大神~ 手动实现KVO 什么是KVO和KVC? KVO内部实现原理 NSNotif...

  • KVO底层原理分析

    一、 KVO内部实现原理 KVO是基于 runtime机制实现的,使用了isa 混写(isa-swizzling)...

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

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

  • iOS ---- KVO的内部实现原理

    Key-Value Observing (KVO) KVO:当指定的对象的属性被修改了,允许对象接收到通知的机制。...

  • iOS 自定义KVO

    自己实现kvo之前,需要知道iOS系统对kvo的实现。 系统实现kvo的原理 这依赖了OC强大的runtime特性...

  • KVO(Key Value Observing)

    KVO的作用: 监听某个对象属性值的改变 KVO的内部实现原理: 1 KVO是基于运行时(runtime)来实现的...

  • KVO内部实现原理

    KVO是基于runtime机制实现的 当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类...

网友评论

  • 国强在线:我有个疑问“系统会偷偷将isa指针指向动态生成的派生类”,isa 指针指向谁,就执行谁吗?怎么查资料时 isa 指针都是指向实例的类,类的元类,元类的根元类。如果 isa 指向了派生类,就算派生类不是类的父类,那么也该先在类中查找 setter 方法啊,当没有 setter 方法实现后 再去 isa 所指向的父类去查找方法,为什么要先去 isa 所指向类里来执行呢?
    _那有只喵:我查资料是 通过ISA,可以在运行时找到一个对象的所有信息,如继承层次结构中的位置,它的实例变量的大小和结构,以及可以相应消息的方法所实现的位置。

    isa:是一个Class 类型的指针. 每个实例对象有个isa的指针,他指向对象的类,而Class里也有个isa的指针, 指向meteClass(元类)。元类保存了类方法的列表。当类方法被调用时,先会从本身查找类方法的实现,如果没有,元类会向他父类查找该方法。同时注意的是:元类(meteClass)也是类,它也是对象。元类也有isa指针,它的isa指针最终指向的是一个根元类(root meteClass).根元类的isa指针指向本身,这样形成了一个封闭的内循环。
  • 国强在线:我一直没弄懂,就是 [self didChangeValueForKey:@"new"]; 是往外发送通知了,可是这个通知是如何被另外一个类收到的呢?

本文标题:iOS KVO内部实现原理

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