说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

深入理解Objective-C的Runtime机制

HTML文档下载 WORD文档下载 PDF文档下载
Objective-C是基于C加入了面向对象特性和消息转发机制的动态语言,除编译器之外,还需用Runtime系统来动态创建类和对象,进行消息发送和转发。本文作者通过分析Apple开源的Runtime代码来深入理解OC的Runtime机制。

Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和转发。下面通过分析Apple开源的Runtime代码(我使用的版本是objc4-646.tar)来深入理解Objective-C的Runtime机制。

Runtime数据结构

在Objective-C中,使用[receiver message]语法并不会马上执行receiver对象的message方法的代码,而是向receiver发送一条message消息,这条消息可能由receiver来处理,也可能由转发给其他对象来处理,也有可能假装没有接收到这条消息而没有处理。其实[receiver message]被编译器转化为:

id objc_msgSend ( id self, SEL op, ... );

下面从两个数据结构id和SEL来逐步分析和理解Runtime有哪些重要的数据结构。

SEL

SEL是函数objc_msgSend第二个参数的数据类型,表示方法选择器,按下面路径打开objc.h文件:

SEL Data Structure

查看到SEL数据结构如下:

typedef struct objc_selector *SEL;

其实它就是映射到方法的C字符串,你可以通过Objc编译器命令@selector()或者Runtime系统的sel_registerName函数来获取一个SEL类型的方法选择器。

如果你知道selector对应的方法名是什么,可以通过NSString* NSStringFromSelector(SEL aSelector)方法将SEL转化为字符串,再用NSLog打印。

id

接下来看objc_msgSend第一个参数的数据类型id,id是通用类型指针,能够表示任何对象。按下面路径打开objc.h文件:

id Data Structure

查看到id数据结构如下:

/// Represents an instance of a class.struct objc_object {    Class isa  OBJC_ISA_AVAILABILITY;};/// A pointer to an instance of a class.typedef struct objc_object *id;

id其实就是一个指向objc_object结构体指针,它包含一个Class isa成员,根据isa指针就可以顺藤摸瓜找到对象所属的类。

注意:根据Apple的官方文档Key-Value Observing Implementation Details提及,key-value observing是使用isa-swizzling的技术实现的,isa指针在运行时被修改,指向一个中间类而不是真正的类。所以,你不应该使用isa指针来确定类的关系,而是使用class方法来确定实例对象的类。

Class

isa指针的数据类型是Class,Class表示对象所属的类,按下面路径打开objc.h文件:


Class Data Structure

/// An opaque type that represents an Objective-C class.typedef struct objc_class *Class;

可以查看到Class其实就是一个objc_class结构体指针,但这个头文件找不到它的定义,需要在runtime.h才能找到objc_class结构体的定义。

按下面路径打开runtime.h文件:

objc_class Data Structure

敏捷开发的6个实战经验 【图文】走近华为企业业务与支撑万人技术团队的云数据中心 《习惯联盟》陈晓冬:与京东云合作让我们没有后顾之忧 流计算与批处理同现:畅享大数据时代的开源实践 挑战和机遇并存:大数据时代机器学习与可视化 【企业开源系列】收发一条Twitter推文的背后 在IE11中更快地获得您需要的内容 暴露程序员身份的8个行为 英特尔创新应用大赛大评审!创新也有中国风 苹果面临一问题:正源源不断地失去优秀工程师 初学编程者必知的五个网站 大数据基准测试专题论坛:基准测试是一把尚未完成的尺子 大数据应用(下):应用驱动技术,DaaS创造价值 大数据研究与发展专题论坛:大数据在各领域中的应用及发展策略 雅虎新目标:欲收购照片分享网站Imgur 移动开发工具访谈《近匠》第01期:七牛云存储—BaaS进化论 ShareSDK:A轮融资到位!将推社会化评论SDK 70美元,你也能用Raspberry Pi做个专属iBeacon基站 7个鲜为人知却超实用的PHP函数 从管理远程式团队和分布式团队中所获得的宝贵经验 Netflix开源数据流管理器Suro Google新创意:天花板加麦克风 人脑植芯片 苹果获弯曲屏新专利 可给手机弄个大波浪卷 真正的跨平台硬件测试:3DMark已打通PC、iOS、Android 将Chrome浏览器变成终端工具 【开源推荐】AllJoyn:打造全球物联网的通用开源框架 21张图带你走进Google数据中心 Snapchat C轮融资5000万美元 投资方是Coatue Management 又一个被谷歌寄生的平台,Chrome应用启动器现来到OS X上 雷军遇上刘德华:创业、艺术、移动互联网 为了抗衡Android,传微软开始考虑WP和WinRT免费 把VC翻译成VB(实现同样功能即可)!关于文件操作 关于addnew的问题(在线等待,一解决马上给分) 两个很菜的UNIX问题! 在win2000 sever中忘记了administrator的密码怎么办(大大的加分) javascript 中的转义字符是什么? 请教SSI 请问有没有办法可以将10M大小的文件用软盘拷到WINDOWS2000中???? 数据库数据导出, 怎么能快点? QQ密码存放在哪? ADO的Query控件 能告诉怎样实现2000服务器的电话回拨吗~~ 初级问题之三,关于DataWindow Error 灌水乐园???? 100分答谢高手!-------谁有写代理服务器的经验呢? 帮一下我好么? 救命!!pb6.5是不是不支持oracle的blob类型???? 去掉引导信息??? 为什么我用MFC写的单文档程序在别人的没装VC++的机子上不能运行? 用户登录是密码存放在哪个文件夹里? (简单问题) 请问这个程序为什么抛出这样一个违例??? 问题一个,请教! 增值合订本出的我心不甘 我又来提问了~前天复习是发现一道很怪异的题目~ 用activemovie控件打开一个URL,用哪个函数? 如何去掉ACTIVE MOIVE控件下面显示的几个键和进度条 c源程序。 >>>>高分求解!!!我在一个对话框中插入一个active report run time design,但程序运行时却不显示,在vb中却可以,如何解决这个问题?????? 关于sql server的安装 哪里有下载cc编译器的? 关于导出数据窗口数据的问题,明白人请进! delphi可不可以用于自动控制方面的开发呢 如何使对话框程序执行就让整个屏幕背景变黑色?? 想了解有关程序考试的一些情况? 不同系统就不可以直接电缆直接吗? 怎样使用PQMAGIC对硬盘进行调整分区 memory fault--core dumped的问题 有谁知道怎么解win98的开机密码? 用 procedure 与 trigger 、database link 能完成吗? flowerofwind,rjcludy()请回答 COM中的一个怪问题:我将::CoUninitialize();去掉后程序不出错,添上出现非法操作,是啥问题??? 请问?????? 如何在程序中播放rm格式的文件??? edit怎么用啊? JB6盘中不含 Borland Enterprise Server AppServer5.0,各位快载一个上去吧! 如何改变显示的分辨率? 那里有c#编译器免费下载?谢谢 如何在vc中播放rm格式的文件??? 那位大侠知道怎么创建并使用一个变量,每次只让一个进程访问???给个例子吧,大大大 大 delphi中怎么编写中断,获取外部设备传来的信息?急救!! 数值模拟与计算仿真,高手请帮忙! 请问:dos下图形放大算法或思路?还有.........(高手请进) 求教!!!!SOS!! --请问如何将一个BMP图形文件转成JPG图形文件,高分请教师--- 氟气与氯气反应方程式条件? 怎样用氟化钠制氟气如题 氟气的氧化性强还是硝酸的氧化性强? 将氟气、氯气和氧气混合起来会发生化学反应吗 氟气的实验室制法及检验、除杂求高手给出氟气的实验室制法的装置、严谨的操作次序、注意事项(如用什么方法收集氟气),以及如何检验收集到的气体是氟气.氟气中可能的杂质有什么?如 氟气的实验室与工业制法 51克2%双氧水和二氧化锰制取氧气,求双氧水含h2o2物质的量,氧气的物质的量(完全反应) 电解氟化钠溶液能否制氟气? 白炽灯泡的钨丝正常工作时温度可高达2000摄氏度左右(钨的熔点是3410℃),长期使用后,钨丝因升华而变细,导致导致灯丝电阻变什么,升华后的钨又什么使灯泡内壁变黑 已知一个正弦交流电的频率f=20HZ,有效值为5A,初相角为30度,求该电流的瞬时值表达式. 随机变量X的概率密度为f(x)=2x, 0 钨、铜的熔点分别是3410℃、1084.5℃,估算最低再结晶温度,并选择再结晶退火温度 一正弦交流电的有效值为3A,频率为50HZ,求该电流瞬时值的表达式怎么算的? 氟气与水的反应是什么?我在书上看到,氟气与氧气反应不仅仅生成氧气和氟化氢,还会生成双氧水等物质,这是怎么回事? 氟气和氯气是什么颜色的?氟气和氯气是什么颜色? 一个正弦交流电的频率是50Hz,有效值5A,初相是-II/2,写出瞬间表达式答案希望详细点 氟气与水反应离子方程式是什么? 氟气是什吗颜色啊 求F(x)=[正弦的平方+(1/2010)*正弦的倒数]*[余弦的平方+(1/2010)*余弦的倒数]的最小值最后的答案是(2/2010)*(2011的根号-1) 交流电电动势瞬时值表达式 为什么是正弦或者是余弦 氟气会和水反应吗? 那些药是从海洋里的生物中提取的(除了鱼肝油、琼胶、精蛋、麟虾油)(☆_☆) 为什么不是直接用海水通氯气制溴,而是用晒盐后的卤水通氯气制溴 氟和氟盐是化工原料.由于氟气性质活泼,很晚才制取出来.第三问用电荷守恒来求氟离子的物质的量浓度为什么求不对?第四问为什么写两个反应式,不可以合在一起写吗 哪些药物是从海洋生物中提取出来的,不要写化妆品! 氟气通入饱和食盐水中为什么不能得到氯气和NaF那么氟气就无法置换出氯气, 设随机变量X的概率密度为f(x)=1/π(1+x^2),(-∞ 过氧化氢制氧气生成的是不是湿润的氧气? 从海水中提取溴 ,以溴离子存在,可向其中通入氟气, 氟气,臭氧哪个氧化性更强? 氧气溶于水会生成过氧化氢么?我的意思是是不是像CO2一样,一部分在水中以分子状态存在少部分与水反应? 从海水中制取溴的过程中是把氯气通入加热到90度,ph=3.5的卤水中,将溴离子化为溴气,用空气吹成的溴气,被碳酸钠溶液吸收得到NaBr和NaBr3混合液,再用酸化混合液,即可得到溴气写出有关的离子 氟离子和氟气哪个氧化性强拜托了各位 谢谢简述理由 在word中如何输入正弦余弦符号,还有物理中的有用功符号,还有C1,这个1写在右下角 交流电的电流计算在三相交流电中,如果,A,B,C三相的电流相等,那么零线的电流为零.现在要计算的是 :在三相交流电中,如果,A,B,两相的电流都为10安培,(C相为0)那么通过零线的电流为多少?怎 怎么证明双氧水具有氧化性 海洋中含量最多的物质是?是物质不是元素! 正弦交流电的等效电流 急任意一段时间内都是Im/根号2吗?我用微积分证明出了 在π/2或者n*π/2的时间段内的等效电流时Im/根号2但是 如果是0~π/6时间内就不是的啊而且 π/6的任意一个时刻的电 氟气、氯气、氧气、液溴、碘、砹、SO3、HNO3、三价铁的氧化性比较 海洋具有十分大的开发潜力,只通过物理变化就能从海水中提取的物质是9.海洋具有十分巨大的开发潜力。只通过物理变化就能从海水中提取的物质是A.碘单质 B.烧碱 C.淡水 D.氯气 求正弦交流电的有效电流值的微积分证明 氟和氧(点燃)哪个氧化性更强? 正弦的倒数是什么 怎么根据用电器的功率计算其电流(交流电) 5%的过氧化氢溶液和10%的过氧化氢溶液,5%的加了二氧化锰,能不能探究二氧化锰对反应速率的影响.. 正弦等于什么? 正弦交流电是指_____和_______都按_______变化的电流 二氧化锰是如何加快过氧化氢的反应速率的 每年有多少石油流入大海 怎样用生活中常见的物质制氟气? MnO2的用量对H2O2制氧的反应速率有影响吗?如果有,怎样影响 海洋科学家预言,21世纪人类将从海洋上的“海藻园”取得石油.海藻是大海中随处可见的海洋植物,由于它具有含油量高的特点,科学家都在积极进行将海藻精炼成类似汽油、柴油等液体燃料用 如何验证二氧化锰在过氧化氢制氧中只做催化剂?要具体的操作方法! 除了氟气,什么物质的氧化性最强. 交流电直流电符号到底是v上面加~还是下面加~ 用氟化钙制氟气如题 氟气 氯气 溴单质 氧化性强弱比较是什么 求碳和氯气、氟气的反应条件氟气和氯气氧化性都强于氧气,所以我觉得氟和碳、氯和碳的反应要比氧和碳的反应简单些还有我是刚毕业的初中生,回答的太深会看不懂的。 二氧化锰为什么可以给过氧化氢当催化剂?要个具体点的 氧化性最强的物质是什么,注意了是物质
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn