- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ObjectiveCRuntime运行时之三方法与消息.doc
前面我们讨论了Runtime中对类和对象的处理,及对成员变量与属性的处理。这一章,我们就要开始讨论Runtime中最有意思的一部分:消息处理机制。我们将详细讨论消息的发送及消息的转发。不过在讨论消息之前,我们先来了解一下与方法相关的一些内容。
基础数据类型
SEL
SEL又叫选择器,是表示一个方法的selector的指针,其定义如下:
typedefstructobjc_selector*SEL;objc_selector结构体的详细定义没有在头文件中找到。方法的selector用于表示运行时方法的名字。Objective-C在编译时,会依据每一个方法的名字、参数序列,生成一个唯一的整型标识(Int类型的地址),这个标识就是SEL。如下代码所示:
SELsel1=@selector(method1);NSLog(@”sel:%p”,sel1);上面的输出为:
2014-10-3018:40:07.518RuntimeTest[52734:466626]sel:0x100002d72两个类之间,不管它们是父类与子类的关系,还是之间没有这种关系,只要方法名相同,那么方法的SEL就是一样的。每一个方法都对应着一个SEL。所以在Objective-C同一个类(及类的继承体系)中,不能存在2个同名的方法,即使参数类型不同也不行。相同的方法只能对应一个SEL。这也就导致Objective-C在处理相同方法名且参数个数相同但类型不同的方法方面的能力很差。如在某个类中定义以下两个方法:
-(void)setWidth:(int)width;-(void)setWidth:(double)width;当然,不同的类可以拥有相同的selector,这个没有问题。不同类的实例对象执行相同的selector时,会在各自的方法列表中去根据selector去寻找自己对应的IMP。
工程中的所有的SEL组成一个Set集合,Set的特点就是唯一,因此SEL是唯一的。因此,如果我们想到这个方法集合中查找某个方法时,只需要去找到这个方法对应的SEL就行了,SEL实际上就是根据方法名hash化了的一个字符串,而对于字符串的比较仅仅需要比较他们的地址就可以了,可以说速度上无语伦比!!但是,有一个问题,就是数量增多会增大hash冲突而导致的性能下降(或是没有冲突,因为也可能用的是perfect hash)。但是不管使用什么样的方法加速,如果能够将总量减少(多个方法可能对应同一个SEL),那将是最犀利的方法。那么,我们就不难理解,为什么SEL仅仅是函数名了。
本质上,SEL只是一个指向方法的指针(准确的说,只是一个根据方法名hash化了的KEY值,能唯一代表一个方法),它的存在只是为了加快方法的查询速度。这个查找过程我们将在下面讨论。
我们可以在运行时添加新的selector,也可以在运行时获取已存在的selector,我们可以通过下面三种方法来获取SEL:
1. sel_registerName函数
2. Objective-C编译器提供的@selector()
3. NSSelectorFromString()方法
IMP
IMP实际上是一个函数指针,指向方法实现的首地址。其定义如下:
id(*IMP)(id,SEL,...)这个函数使用当前CPU架构实现的标准的C调用约定。第一个参数是指向self的指针(如果是实例方法,则是类实例的内存地址;如果是类方法,则是指向元类的指针),第二个参数是方法选择器(selector),接下来是方法的实际参数列表。
前面介绍过的SEL就是为了查找方法的最终实现IMP的。由于每个方法对应唯一的SEL,因此我们可以通过SEL方便快速准确地获得它所对应的IMP,查找过程将在下面讨论。取得IMP后,我们就获得了执行这个方法代码的入口点,此时,我们就可以像调用普通的C语言函数一样来使用这个函数指针了。
通过取得IMP,我们可以跳过Runtime的消息传递机制,直接执行IMP指向的函数实现,这样省去了Runtime消息传递过程中所做的一系列查找操作,会比直接向对象发送消息高效一些。
Method
介绍完SEL和IMP,我们就可以来讲讲Method了。Method用于表示类定义中的方法,则定义如下:
typedefstructobjc_method*Method;structobjc_method{SELmethod_nameOBJC2_UNAVAILABLE;//方法名char*method_typesOBJC2_UNAVAILABLE;IMPmethod_impOBJC2_UNAVAILABLE;//方法实现}我们可以看到该结构体中包含一个SEL和IMP,实际上相当于在SEL和IMP之间作了一个映射。有了SEL,我们便可以找到对应的IM
您可能关注的文档
- MD收放卷张力控制.ppt
- MeasurementSystems(测量系统).ppt
- MentorIIMaintenance直流调速.ppt
- MES包装系统使用手册.ppt
- META口试题库.doc
- MGBWD型采煤机说明书.doc
- MgRE基稀土镁合金组织性能与腐蚀机理研究.ppt
- MGWD无链电牵引采煤机.ppt
- MG竞品最新.ppt
- MG节油大赛方案.ppt
- 2019年中级会计师《中级会计实务》练习题 附解析 .pdf
- 2019年初级银行从业资格证《银行管理》能力检测试卷 附答案 .pdf
- 2019-2020年九年级物理上册 第11章 功和功率学案(新版)苏科版.pdf
- 2018银行从业资格考试初级银行管理章节试题五 .pdf
- 2021年《中国历史》七年级上册历史全册考点梳理(精编) .pdf
- 2020年成都龙泉一中高三生物月考试卷及参考答案 .pdf
- 2019年一级消防工程师《技术实务》真题及答案(回忆版) .pdf
- 2018年初级银行职业资格《银行管理》试题(网友回忆版) .pdf
- 2019届内蒙古赤峰市宁城县高三下学期第三次模拟历史试卷【含答案及解析.pdf
- 2016-2017年广西玉林市陆川县七年级(下)期末数学试卷(解析版) .pdf
文档评论(0)