2016笔记——KVO

作者: 满庭花醉三千客 | 来源:发表于2018-07-27 13:29 被阅读5次

记得KVO是最早接触的属性与方法相关联的实现方式,也是最简单的方法。

究竟KVO是如何实现的呢?

探究一番:

屏幕快照 2016-03-31 17.02.41.png

猜猜会打印出什么?看结果吧:

屏幕快照 2016-03-31 17.02.08.png

一个是Person类,另一个是NSKVONotifying_Person类。

其中object_getClassName()方法:

typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;

屏幕快照 2016-03-31 17.08.44.png

是一个获取对象的真实类型的方法,定义在runtime.h文件中。

前后WQL的类别发生了变化,说明了:

我们在对某个对象完成监听的注册后,编译器会修改监听对象的isa指针,让这个指针指向一个新生成的中间类。

这里要说明的是isa这个指针,isa是一个Class类型的指针,对象的首地址一般是isa变量,同时isa又保存了对象的类对象的首地址。我们通过object_getClass方法来实现就是获取这个对象的元类,即是对象的类对象(Person)的类型。Class方法获得对象的类型。

每一个对象占用的内存中,一部分是父类属性占用的,在父类占用的内存中,又有一部分是父类的父类占用的。isa指针指向的是父类,因此WQL的地址从Person开始,Person的地址从NSObject开始,这三个对象内存的地址都是一样的,通过这个我们能猜到苹果文档中所提到的中间类就是被监听对象的字类,而且为饿了隐藏实现,苹果还重写了这个字类的class方法和description方法来掩人耳目。另外新类相对于父类添加了一个NSKVONotifying_前缀,这个前缀是为了避免多次创建监听字类,节省资源。

大概流程为这样:

屏幕快照 2016-03-30 11.10.48.png

加油~

相关文章

  • 2016笔记——KVO

    记得KVO是最早接触的属性与方法相关联的实现方式,也是最简单的方法。 究竟KVO是如何实现的呢? 探究一番: 猜猜...

  • iOS面试题(4) KVO KVC

    声明,不是原创,笔记均来自 群主大神~ 手动实现KVO 什么是KVO和KVC? KVO内部实现原理 NSNotif...

  • KVC、KVO的本质

    这篇文章介绍KVC、KVO的本质。如果你对KVC、KVO不了解,推荐先查看其用法:KVC和KVO学习笔记[http...

  • (转)kvo

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

  • OC底层学习笔记(3)-KVO的实现

    注:文章为自己学习李明杰老师的OC底层视频做的随手笔记 什么是KVO? KVO的全称是key-value obse...

  • KVO的浅显理解

    近两天看视频教程,粗略的学习了一下KVO的使用。做个笔记,以便后期自己查阅。KVO的实质则是通过iOS的runti...

  • iOS原理篇(一): KVO实现原理

    KVO实现原理 什么是 KVO KVO 基本使用 KVO 的本质 总结 一 、 什么是KVO KVO(Key-Va...

  • load/initalize/MethodSwizzling/B

    前言 2016年6月7号开始load/initalize/KVO/KVC/Block,并通过代码实现 load/i...

  • 笔记(二):KVO

    一 基本使用 KVO: key-value observing 二 KVO本质 从两个方法可以证明对一个对象添加...

  • KVO学习笔记

    KVO KVO 操作需要三步完成 (KVO是观察者设计的一个模式) 第一步:添加一个观察者(在viewDidLoa...

网友评论

    本文标题:2016笔记——KVO

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