KVO实现原理和具体应用

本文详细介绍了Objective-C中的Key-Value Observing(KVO)机制,包括其工作原理、实现方式及应用场景。KVO是一种观察者模式的实现,允许对象在某个属性改变时自动收到通知。KVO的实现依赖于Runtime,当对象的属性被观察时,系统会动态创建一个派生类并重写被观察属性的setter方法,以实现通知机制。在派生类中,setter方法调用`willChangeValueForKey:`和`didChangeValueForKey:`方法来触发通知。KVO的特点是观察者只观察属性,且必须遵循KVO的属性设置方式来变更值。文章还提供了KVO的实现步骤和示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是KVO?

KVOkey-value observing)是Objective-C对观察者设计模式的一种实现。【另一种是:通知机制(notification),详情参考:iOS 趣谈设计模式——通知】;

KVO提供一种机制,指定一个被观察的对象(A类),当对象某个属性(A中的属性name)发生更改时,对象会获得通知,并作出相应处理;【且不需要给被观察的对象添加任何额外代码,就能使用KVO机制】

KVO在MVC设计架构下的项目很适合实现mode模型和view视图指尖的通讯。

例如:代码中,在模型类A创建属性数据,在控制器中创建观察者,一旦属性数据发生改变就收到观察者收到通知,通过KVO再在控制器使用回调方法处理实现视图B的更新。

二、实现原理

KVO在Apple中的API文档如下:

Automatic key-value observing is implemented using a technique called isa-swizzling… When an observer is registered foran attribute of an object the isa pointer of the observed object is modified, pointing to an intermediate classrather than at the trueclass

KVO的实现依赖于Runtime,Apple的文档对于KVO机制的实现细节没有过多的描述,但是我们可以通过Runtime的所提供的发放区探索【可参考:Runtime的几个小例子】,关于KVO机制的底层实现原理:

基本原理:

1、KVO是关于runtime机制实现的

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

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

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

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

KVO深入原理:

Apple使用了isa混写(isa-swizzling)来实现KVO。当观察对象A时,K

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈荣科

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值