四、KVO 探究

作者: 流小贝 | 来源:发表于2022-05-06 09:44 被阅读0次

1、KVO的定义(Key-Value Observing)

俗称键值监听。它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

KVO是“观察者”设计模式的一种应用,利用它可以很容易实现视图组件和数据模型的分离,当数据模型的属性值改变之后作为监听器的视图组件就会被激发,激发时就会回调监听器自身。这种模式有利于两个类间的解耦合,尤其是对于业务逻辑与视图控制 这两个功能的解耦合。

和KVC类似,在ObjC中要实现KVO则必须实现NSKeyValueObServing协议,但不用担心,因为NSObject已经实现了该协议,因此几乎所有的ObjC对象都可以使用KVO.

KVO常用的方法

1>注册指定Key路径的监听器

- (void)addObserver:(NSObject )observer forKeyPath:(NSString )keyPath

options:(NSKeyValueObservingOptions)options context:(void *)context

相关参数:

observer:观察者,也就是KVO通知的订阅者。订阅着必须实现

observeValueForKeyPath:ofObject:change:context:方法

keyPath:描述将要观察的属性,相对于被观察者。

options:KVO的一些属性配置;有四个选项。

options所包括的内容:

NSKeyValueObservingOptionNew:change字典包括改变后的值

NSKeyValueObservingOptionOld: change字典包括改变前的值

NSKeyValueObservingOptionInitial:注册后立刻触发KVO通知

NSKeyValueObservingOptionPrior:值改变前是否也要通知(这个key决定了是否在改变前改变后通知两次)

context: 上下文,这个会传递到订阅着的函数中,用来区分消息,所以应当是不同的。

2、KVO的本质就是通过重写setter方法来实现的

KVO的本质是通过重写setter方法来实现的,Objective-C是一门动态的语言,苹果在底层帮我生成了一个被观察对象类的子类,假如当前类是Apple类,通过运行时机制,生产了一个叫做NSKVONotifying_Apple的子类,让后将被观察者对象(apple)的isa指针指向新创建的类,这样,在子类中重写setter方法,并且在setter方法之中通过发送消息告诉观察者所观察的对象的属性值发生了变化,这样就可以根据变化做对应的处理。

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

   3.1、利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类;

   3.2、当修改instance对象的属性时,会调用Foundation的_NSSetXXXValueAndNotify函数

        3.2.1、先调用willChangeValueForKey;

        3.2.2、接着调用父类原来的setter方法;

         3.2.3、最后调用didChangeValueForKey,其内部会触发监听器(Oberser)的监听方法(observerValueForKeyPath:ofObject:change:context:);

4、如何手动触发KVO?

手动调用willChangeValueForKey: 和 didChangeValueForKey:

5、直接修改成员变量会触发KVO么?

不会触发KVO

6、通过KVC修改属性会触发KVO么?

会触发KVO,KVC在修改属性时,会调用willChangeValueForKey: 和 didChangeValueForKey:方法;

7、KVC的赋值和取值过程是怎样的?原理是什么?

KVC赋值(setValue:forKey:)流程图

7.1、首先会按照setKey、_setKey的顺序查找方法,若找到方法,则直接调用方法并赋值; 2、未找到方法,则调用+ (BOOL)accessInstanceVariablesDirectly; 3、若accessInstanceVariablesDirectly方法返回YES,则按照_key、_isKey、key、isKey的顺序查找成员变量,找到直接赋值,找不到则抛出异常; 4、若accessInstanceVariablesDirectly方法返回NO,则直接抛出异常;

KVC取值(valueForKey:)流程图

7.2、首先会按照getKey、key、isKey、_key的顺序查找方法,找到直接调用取值

7.3、若未找到,则查看+ (BOOL)accessInstanceVariablesDirectly的返回值,若返回NO,则直接抛出异常;

7.4、若返回的YES,则按照_key、_isKey、key、isKey的顺序查找成员变量,找到则取值;

7.5、找不到则抛出异常;

相关文章

  • 四、KVO 探究

    1、KVO的定义(Key-Value Observing) 俗称键值监听。它提供一种机制,当指定的对象的属性被修改...

  • swift中KVO和属性观察器

    开篇提醒:OC中的KVO及其KVO的基础知识可参见:深入runtime探究KVO Swift中,原本没有KVO模式...

  • KVO探究

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

  • KVO探究

    1. 介绍 键值观察是一种机制,它允许将其他对象的指定属性的更改通知给对象。 对于MVC中model层和contr...

  • KVO-KVC的原理探究 - KVO篇

    关于KVO的探究 KVO的基本使用 创建Person类,添加属性age: 在ViewController中添加属性...

  • iOS开发·KVO用法,原理与底层实现: runtime模拟实现

    摘要:这篇文章首先介绍KVO的基本用法,接着探究 KVO (Key-Value Observing) 实现机制,并...

  • KVO进阶——KVO实现探究

    本篇会对KVO的实现进行探究,不涉及太多KVO的使用方法,但是会有一些使用时的思考。 一、使用上的疑问 1.key...

  • iOS开发·KVO用法,原理与底层实现: runtime模拟实现

    本文Demo传送门:CMKVODemo 摘要:这篇文章首先介绍KVO的基本用法,接着探究 KVO (Key-Val...

  • 探究KVO本质

    看了一些资料,对OC更加深入了解,记录总结一下。KVO:key-value-boserver,键-值-监听。主要是...

  • KVO原理探究

    kvo原理:利用运行时,生成对象子类,并生成子类的对象,并替换原来的对象的isa指针(地址不发生变化,变化的是值)...

网友评论

    本文标题:四、KVO 探究

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