文档章节

KVC/KVO实现原理分析

Lambda8421
 Lambda8421
发布于 2015/02/06 17:39
字数 681
阅读 37
收藏 1

1. 函数调用(消息)实现分析:

我们看这条语句:

[代码]c#/cpp/oc代码:

1 [self.person setValue:@"Vincent"forKey:@"name"];

就会被编译器处理成:

[代码]c#/cpp/oc代码:

1 SEL sel = sel_get_uid ("setValue:forKey:");
2  
3 IMP method = objc_msg_lookup (self.person->isa,sel);
4  
5 method(self.person, sel,@"Vincent",@"name");

也就是说iOS中函数调用并不是被静态编译为地址调用,而是被转为查表、调用!

2. 这里需要介绍几个基本概念:

(1). SEL数据类型:它是编译器运行Objective-C里的方法的环境参数。

(2). IMP数据类型:他其实就是一个 编译器内部实现时候的函数指针。当Objective-C编译器去处理实现一个方法的时候,就会指向一个IMP对象,这个对象是C语言表述的类型(事实上,在Objective-C的编译器处理的时候,基本上都是C语言的)。

(3). isa指针,如其名称所指,(就是is a kind of的意思),指向维护分发表的对象的类。该分发表实际上包含了指向实现类中的方法的指针,和其它数据。


3.  KVO/KVC实现分析:

当我们为一个类的某个属性添加observer时候,框架自动创建这个类的一个子类,并且修改这个类的isa指向这个新的子类。

由于在ios中函数调用都是转化为isa查表形式,所以这次查得时新的子类的表,

也就是说对类的函数调用被子类给拦截了,在拦截的实现中就可以通知observer了。


修改类的isa被称为isa-swizzling技术。isa-swizzling就是类型混合指针机制。KVC主要通过isa-swizzling,来实现其内部查找定位的。


比如还是这段代码:   

[代码]c#/cpp/oc代码:

1 [self.person setValue:@"Vincent"forKey:@"name"];


它会被编译为:

[代码]c#/cpp/oc代码:

1 SEL sel = sel_get_uid ("setValue:forKey:");
2  
3 IMP method = objc_msg_lookup (self.person->isa,sel);
4  
5 method(self.person, sel,@"Vincent",@"name");


这里的isa是动态生成的子类,你debugger调试一个被观察的类就会发现它的isa已经发生了变化!而没有被观察的类的isa是正常的,如图所示:

也就是说我们调用setValue...的时候实际上已经调用observer的didChangeValueForKey:方法!


因为KVC的实现机制,可以很容易看到某个KVC操作的Key,而后也很容易的跟观察者注册表中的Key进行匹对。假如访问的Key是被观察的Key,那么我们在内部就可以很容易的到观察者注册表中去找到观察者对象,而后给他发送消息。


© 著作权归作者所有

上一篇: nib文件加载过程
下一篇: iosx系统架构
Lambda8421
粉丝 10
博文 121
码字总数 121640
作品 0
闸北
程序员
私信 提问
KVC/KVO 的使用及原理分析

KVC/KVO 概念 KVC : 即 Key-Value-Coding,用于键值编码。作为 cocoa 的一个标准化组成部分,它是基于 NSKeyValueCoding 非正式协议的机制。简单来说,就是直接通过 key 值对对象的属性进行...

满脸胡茬的小码农
2017/11/14
0
0
iOS基础黑科技:KVO(键值观察)以及KVC(键值编码)

一、前言: 许多大神的博客都有关于KVO以及KVC的分析,在这里我整理一下自己关于KVO以及KVC的理解。求大神们轻喷~~ 二、基本概念: 1、键值编码(KVC):顾名思义,键值编码是一种访问对象属...

MichaelLee_
2017/12/19
0
0
程序员面试闪充 -- KVC&KVO

一、键值编码KVC kvc&kvo视频讲解 1、介绍 由于oc的语言特性,使得开发者根本不必进行任何操作就可以进行属性的动态读写,这种方式就是Key Value Coding(简称KVC)。 KVC的操作方法由NSKey...

阡陌有客
2018/03/20
0
0
KVC 与 KVO 理解

KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解。 Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问...

Im刘亚芳
2014/12/04
0
0
透彻理解 KVO 观察者模式(附基于runtime实现代码)

作者的话:空谈原理不如动手实现,猜测苹果工程师的设计思路,实在有趣😁。 推荐另一篇文章:透彻理解 NSNotificationCenter 通知(含实现代码) 前言 iOS开发中,有一种设计模式应用广泛,...

indulge_in
2018/03/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

任务调度-第三方库Quartz实现分布式任务管理与调度

1. 为什么要用第三方库Quartz来实现分布式任务管理和调度? 首先管理的目的是通过集群多节点的管理提供容错,调度的目的是保证同一任务只会被完整执行一次;之前分享过的任务调度-单体应用定...

秋日芒草
19分钟前
2
0
Mysql Explain Type

前言 当我们执行sql,一般都会用Explain来查看sql的效率如何。今天在看sql执行效率的时候,忘记了其中Type的意思,现在在此记录一下。 效率 这里的type指的是访问类型,各个效率高低如下: ...

无敌小杰杰
27分钟前
2
0
外部浏览器网页复制公众号无法自动唤起微信并关注怎么办?

现在有很多用户在外部浏览器网页复制公众号时无法自动唤起微信并关注,这是因为第三方浏览器打开微信的接口,微信只给部分合作平台开放了接口权限,任何第三方想调用只能是通过一些技术手段来...

qjniop
31分钟前
1
0
建造者模式

建造者模式(Builder Pattern) 也叫生成器模式,其定义如下: Separate the construction of a complex object from its representation so that the same construction process can create d......

无知的小狼
36分钟前
0
0
距离计算方法

1、欧式距离(欧几里得距离) 欧式距离是最易理解的距离定义,即各坐标点的坐标之差的平方和相加,然后开根号。 二维平面上点 与点 之间的距离公式是: n维空间上点 和点 之间的距离公式是:...

城北徐公美
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部