(转)kvo

http://xiongzenghuidegithub.github.io/blog/2016/05/16/kvo-part1/

对KVO的大致实现做个最终总结:


第一步、当一个对象的属性添加了属性观察者之后,这个对象的 isa指针会被修改

注意: 是这个对象的isa指针,而不是这个对象所属类的isa指针

第二步、由runtime在运行时创建出一个对象所属类的一个子类,名字的格式是NSKVONotifying_原始类名

第三步、重写原来父类中被观察属性property的setter方法实现

class_addMethod()

class_replaceMethod()

// 大致格式如下

- (void)setType:(NSSting *)type {

//1. 调用父类Cat设置属性值的方法实现

[super setType:type];

//2. 通知Cat对象的观察者执行回调(从断点效果看是同步执行的)

[cat对象的观察者 observeValueForKeyPath:@"type"  ofObject:self  change:@{}  context:nil];

}

第四步、对象的 isa指针,由runtime系统替换指向为第二步中创建的中间类NSKVONotifying_原始类名

第五步、当对象的被观察属性值发生改变时(中间类的setter方法实现被调用),就会回调执行观察者的observeValueForKeyPath: ofObject:change:context:方法实现

从断点调用来看,这个回调过程是同步执行的

第六步,如下两个方法的返回的objc_class结构体实例是不同的

object_getClass(被观察者对象) >>> 返回的是替换后的中间类

[被观察对象 class] >>> 仍然然会之前的原始类

第七步、当对象移除属性观察者之后,该对象的isa指针又会恢复指向为原始类

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

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,868评论 0 9
  • 最近使用MVVM在写一个Demo,习惯MVVM的思想后,写一个tableView的时候,我想要自动在数据变动的时候...
    IUVO阅读 640评论 0 0
  • 题目: 出处:先是程序员,然后才是iOS程序员 — 写给广大非科班iOS开发者的一篇面试总结如果让你实现属性的we...
    林大鹏阅读 1,183评论 0 13
  • 上半年有段时间做了一个项目,项目中聊天界面用到了音频播放,涉及到进度条,当时做android时候处理的不太好,由于...
    DaZenD阅读 3,054评论 0 26
  • 一、概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则其观察...
    DeerRun阅读 10,155评论 11 33