初识Runtime之KVO实现原理

本文介绍了Runtime运行时在iOS开发中的应用,特别是如何利用Runtime实现Key-Value Observing(KVO)。通过动态添加子类、重写属性的set方法来实现KVO,文中详细描述了KVO的实现步骤,并给出了代码示例。
摘要由CSDN通过智能技术生成

Runtime运行时是在iOS代码运行时将其翻译成对应的C语言程序。
Runtime 运行时是苹果提供的一个API,属于一个C语言的库。那么在iOS开发中,Runtime运行时有什么用呢?
1. 利用Runtime运行时,在程序的运行过程中,动态创建一个类。
2. 利用Runtime运行时,在程序的运行过程中,动态修改一个类的属性/方法。
3. 利用Runtime运行时,遍历一个类的所有的属性和方法。
用的时候需要导入头文件: objc/runtime.h/objc/message.h(包含了objc/runtime.h)(需要加上尖括号,由于这个编辑器的原因,直接加上尖括号,导致无法显示)
Method:成员方法
Ivar :成员变量

上面是对Runtime运行时的一个简单概括,我之前一直只是知道有Runtime这个东西的存在,但是具体实例一直没有研究过,感觉跟Runtime相关的更多的是长篇大论的理论,所以总是不能很好的去理解Runtime具体是怎么工作和应用的。最近看了Hank老师的公开课,感觉明了了很多,下面就介绍一下用Runtime运行时来实现KVO的一个过程,基本步骤如下:

  1. 动态添加被监听对象类的一个子类;
  2. 在该子类中动态添加被监听的属性的set方法,即重写父类的属性的set方法;
  3. 当调用被监听的属性的set方法且改属性的值发生改变的时候通知外界。

特别注意:
一个类的属性赋值形式为object.property = …
一个类的成员变量赋值形式为object->MemberVariable = …
KVO不能观察到成员变量的值的变化,因为KVO是动态添加了一个被监听对象类的子类,然后重写了被监听对象类的属性的set方法,在该方法中来做的通知,所以只有调用set方法才能被检测到。

我这篇文章是看了Hank老师的公开课后整理的,那我先总结一下Hank老师讲的内容,下面是我做的笔记:

KVO原理和实现过程说明(非代码,最后面会给出我自己实现KVO的完整demo):
Person * _p = [[Person alloc] init];
[_p addObserver:self forKeyPath:@“age” options:NSKeyValueObservingOptionNew context:nil];
只要添加这行代码,调用时,runtime会动态添加一个Person类的子类 NSKVONotifying_Person类,然后在这个类中重写age属性的set方法,并把_p的真实类型改为NSKVONotifying_Person,然后一旦调用_p.age就是调用子类的age的set方法,一旦子类的age的值发生改变就会通知-(void)observeValueForKeyPath:ofObject:change: context;

KVO重写的set方法:
这里写图片描述

willChangeValueForKey和didChangeValueForKey都会通知–(void)observeValueForKeyPath:ofObject:change: context;方法,change是dictionary,里面放的是keyPath的旧值和新值,willChangeValueForKey会把旧值给过去,didChangeValueForKey会把新值给过去

以上是我听了Hank老师的视频总结的(如果理解有错请指教),然后我自己就想验证一下,但是写到重写set方法的时候,调用了willChangeValueForKey和didChangeValueForKey方法,然而并没有收到通知,原因我还没弄明白,但是我查了一些资料,一些只是说调用willChangeValueForKey和didChangeValueForKey方法就会触发通知,但是并没有给出具体代码。还有看到实现了KVO的,但是并不是调用的willChangeValueForKey和didChangeValueForKey方法,所以我的这个demo也没有调用willChangeValueForKey和didChangeValueForKey方法,如果有用willChangeValueForKey和didChangeValueForKey方法来实现的希望可以分享下代码。我的demo地址为KVO_Runtime_Demo

有兴趣的可以看一下demo的源码,下面我会根据我的demo的代码来说一下KVO的实现过程:
首先创建一个Person类和一个NSObject类的分类(因为需要所有类都可以调用,可参考原生KVO的addObserver方法),demo目录结构如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值