iOS -- KVO 基于runtime的剖析

最近一直有小伙伴问我kvo基于运行时的一些底层原理,觉得有必要写点东西记录一下。所谓KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则其观察者就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。KVO其实也是“观察者”设计模式的一种应用。这种模式有利于两个类间的解耦合,尤其是对于 业务逻辑与视图控制 这两个功能的解耦合。KVO 的具体实现具体实现代码如下:


当改变被观察对象person的值时,观察者Viewcontroller会调用相应观察者方法


KVO 的实现原理

KVO 是基于运行时实现的

isa Class NSKVONotifying_Person 


上述例子中,如上图,当 p1.name 的值改变时,p1对象的 isa 指针会指向 NSKVONotifying_Person(这里我喜欢称之为中间类),意味着,在程序运行时,会动态生成一个 NSKVONotifying_Person 类,该类继承于 Person,而且该类中也有个 -setName: 方法,方法中在设置 name 的同时实现了:

- (void)setName:(NSString *)name

{

[super setName:name];

// 这两个方法底层会调用observer的- (void)observeValueForKeyPath: ofObject: change: context:这个方法

[self willChangeValueForKey:@"age"];

[self didChangeValueForKey:@"age"];

}

至此kvo基于运行时的实现已经不再神秘。。。更加详细的剖析,会在大伙有需求的时候再来做总结

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则其观察...
    DeerRun阅读 10,128评论 11 33
  • 20- 枚举,枚举原始值,枚举相关值,switch提取枚举关联值 Swift枚举: Swift中的枚举比OC中的枚...
    iOS_恒仔阅读 2,313评论 1 6
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,774评论 0 9
  • KVC和KVO在实际的运用中是很常见的。所以了解它的底层实现原理是非常不错的一件事。 KVC(NSKeyValue...
    HelloAda阅读 2,533评论 0 3
  • 一、什么是KVO KVO和Notification是Objective-C语言中观察者模式的两种实现机制。KVO指...
    坤坤同学阅读 296评论 0 0