Runtime 运行时之一:消息传递
什么是Runtime?
Runtime顾名思义即为运行时。就是系统运行时候的一些机制,它提供了一些使得对象之间能够传递消息的重要函数,其中最主要的就是消息机制了。相较于C语言而言,C语言使用的是“静态绑定”,函数的调用在编译期就能知道运行期所需要调用的函数了,编译完成之后就按照顺序执行(面向过程就是这么任性)。而OC使用的是“动态绑定”特性,也就是说编译器在编译期的时候无法决定运行期调用哪个函数,也就是说在编译阶段,OC可以调用任何函数,即使该函数未实现,但只要声明过就不会报错,而C语言则会报错(怎么能容忍它放纵,必须报错),对象在接收到消息之后,究竟该调用哪个方法完全由运行期决定,甚至可以在程序运行时改变(这里涉及到“消息转发”机制,下篇文章会讲述)。
Runtime相关原理
消息传递机制原理
Runtime所涉及到的范围比较广泛,本文只针对消息传递机制这点进行展开(终于开始重点啦。。。)。好了,我们开始重点。
OC中,当调用某个对象的方法时,其实质上就是向该对象发送了一条消息,比如:
id returnValue = [someObject messageName:paramater];
上面的例子是调用了someObject对象的messageName:方法,并且传入一个参数paramater,并将返回值赋值给id类型的returnValue。在首先介绍消息传递机制之前,先介绍下消息传递机制中所调用的核心函数:
void objc_msgSend(id self, SEL cmd, …)
该函数是个参数可变的函数,能接收两个及以上的参数,第一个参数代表方法接收者,第二个参数带便选择子(SEL是选择子的类型),后续参数则为方法调用所需要的相应参数。
编译器在看到刚才那个例子的消息后会转化成如下C语言函数:
id returnValue = objc_msgSend(someObject, @selector(messageName:), paramater);
objc_msgSend函数会依据接收者和选择子来调用适当的方法。首先在自己所属类中的缓存中查找相应方法,若找到就跳转;若缓存中查找不到,则从所属类的方法列表中查找,若在方法列表中找到,则直接跳转并将方法添加到缓存中(OC方法在第一次调用之后会添加到缓存中,以便后续调用该方法能够快速查找到,提高查找速度);若方法列表中也查询不到,则沿着该对象的所属类的继承体系继续向上查找,等找到合适的方法之后跳转并加入到缓存中;如果最终还是找不到相符的方法,就会启动“消息转发”操作(本文不进行展开)。
在每个类中都会有这样一张表格,该表中以选择子的名称作为查找的“键”,每个“键”会对应唯一一个“值”,也即为函数实现(IMP),每次通过相应的“键”来从映射表中查找到对应的值进行返回,这种实现方式可以帮助我们快速定位到所需要的函数。
Runtime 运行时之一:消息传递的更多相关文章
- iOS开发——高级特性&Runtime运行时特性详解
Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 ...
- ios - runtime运行时应用---交换方法
runtime运行时用法之一 --- 交换类的方法,此处简单写了把系统的UIView的setBackgroundColor的方法换成了自定义的pb_setBackgroundColor 首先创建UIV ...
- Runtime运行时的那点事儿
注:本文是对 Colin Wheeler 的 Understanding the Objective-C Runtime 的翻译. 初学 Objective-C(以下简称ObjC) 的人很容易忽略一个 ...
- runtime 运行时机制 完全解读
runtime 运行时机制 完全解读 目录[-] import import 我们前面已经讲过一篇runtime 原理,现在这篇文章主要介绍的是runtime是什么以及怎么用!希望对读者有所帮助! ...
- 编译器设计-RunTime运行时环境
编译器设计-RunTime运行时环境 Compiler Design - Run-Time Environment 作为源代码的程序仅仅是文本(代码.语句等)的集合,要使其活动,它需要在目标计算机上执 ...
- iOS开发之runtime运行时机制
最近参加三次面试都有被问到runtime,因为不太懂runtime我就只能支支吾吾的说点零碎.我真的好几次努力想看一看runtime的知识,因为知道理解它对理解OC代码内部变化有一定帮助,不过真心觉得 ...
- Objective-C Runtime 运行时之三:方法与消息
基础数据类型 SEL SEL又叫选择器,是表示一个方法的selector的指针,其定义如下: typedef struct objc_selector *SEL; objc_selector结构体的详 ...
- Runtime运行时机制
Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的 我们需要了解的是 Objective-C 是一门动态语言, ...
- Objective-C Runtime 运行时之三:方法与消息(转载)
前面我们讨论了Runtime中对类和对象的处理,及对成员变量与属性的处理.这一章,我们就要开始讨论Runtime中最有意思的一部分:消息处理机制.我们将详细讨论消息的发送及消息的转发.不过在讨论消息之 ...
随机推荐
- 一款基于jquery带百分比的响应式进度加载条
今天要给大家带来一款基于jquery带百分比的响应式进度加载条.这款加载条非常漂亮,而且带有进度的百度比,且在不同的百分比用的是不同的颜色.而且这款加载条采用了响应式设计,在不同的分辨率的显示器下完美 ...
- hive 进阶笔记
-- mysql方式 create table account_channel(account_ String,channel_ String) as select a.account,b.chann ...
- 在CMD下启动vmware、Xshell连接虚拟机以及控制Chrome浏览器自动执行js登录校园网
标题有点长,主要是写个bat出来玩玩, (1)不用每次都手动关闭mysql服务(我不想把它设为手动启动,有强迫症) (2)然后希望每次vmware能自动连上虚拟机 (3)以及每次Xshell都能自动启 ...
- python 提示 AttributeError: module 'json' has no attribute 'dumps'
最近在学习python解析json的时候遇到问题, 提示 AttributeError: module 'json' has no attribute 'dumps' (模块没有dumps属性的意思) ...
- yarn 用户导致的被挖矿 启用Kerberos认证功能,禁止匿名访问修改8088端口
用户为dr.who,问下内部使用人员,都没有任务在跑: 结论: 恭喜你,你中毒了,攻击者利用Hadoop Yarn资源管理系统REST API未授权漏洞对服务器进行攻击,攻击者可以在未授权的情况下远程 ...
- 预留端口避免占用ip_local_reserved_ports
问题描述: 业务遇到这个情况,在重启服务时,出现1986端口被占用而无法启动,非得等该端口释放后才启动成功. 问题分析: 1986端口被该服务器上的客户端随机选取源端口给占用掉了. 解决方案: 使 ...
- LINQ操作符一:Select
一.什么是LINQ?它可以用来做什么 语言集成查询(Language Integrated Query,LINQ)是一系列标准查询操作符的集合,这些操作符几乎对每一种数据源的导航.过滤和执行操作都提供 ...
- linux下node-webkit安装vlc插件
一.下载node-webkit 下载linux版本的node-webkit,网址如下:https://github.com/rogerwang/node-webkit.文件解压之后又如下几个文件,其中 ...
- SQL计算表的列数
select count(syscolumns.name) from syscolumns , sysobjects where syscolumns.id = sysobjects.id and s ...
- 统一建模语言 UML (2)
UML的图 1.用例图(use case diagram) 用例图(Use Case Diagram)是被称为参与者(Actor)的外部用户所能观察到的系统功能的模型图 列出系统中的用例和参与者 显示 ...