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

深入理解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

AsyncTask实现原理和内部代码 Neither user nor current process错误 ListView的右边滚动滑块启用方法 Live Wallpaper动态壁纸开发 控制软键盘显示和隐藏 设置Activity大小不再全屏原理 Android面试题,看看你基础如何? Android Canvas绘图抗锯齿解决方法 Android xliff和字符串资源 android.hardware.USB类介绍 Android开发经验谈之应用间数据共享 android_asset这个URL详细使用方法 Android 2.3系统自带高清UI图标下载 设置ScrollView滚动条的颜色 WakeLock使用方法示例代码 Concurrent并发库常见问题总结 Android数据库SQLite性能优化技巧 Android开发之Java设计模式基础篇 Android开发之Java设计模式入门篇 Android开发之Java设计模式 Android开发之Java并发包集合类性能分析 Android开发之Java集合类性能分析 Android开发之Java虚拟机原理和内存分配 Android开发之Java基础系列教程目录 Android Theme主题样式开发注意点 Android 3.0开发用的平板推荐 android.resource://这个Uri你知道吗 ADT插件的10.0.1必须要Eclipse 3.5才能升级 Android线程优先级设置方法 Android Zip文件解压缩代码 Android开发之设置断点单步调试 中秋节快乐,散分了 程序如何在运行时取得数据库的建表SQL ************* 中秋快乐,抗日光荣 ************* database profile不能创建? 采用JBuilder9+WebLogic8.1连接DB2的问题! 帮忙评评,客观一点。强烈给分。 问题还未解决,高手仍需帮忙!!!!!! 关于DDB与DIB概念的问题 深圳公司招聘DELPHI高手 在线等SQL SERVER中查询出数据导入到EXCEL 中 请问如何改变本页的浏览器中的地址栏的网名? 谁有Active Report for .Net 的破解版 关于串口通信2问 wince支不支持叫大容量物理内存的申请 中秋快乐,顶者有分。帮忙评评。 急! 求问用在BCB或DEPHI那种方法把标准文本文件导入数据库效率最高 一个初学.net的问题,望大家不要见笑!! 多个文件在光盘里面先后自动启动 C#中类型转换,请大家看看: 中秋节散分 关于.net下客户端与数据库字符集不同时的处理 大家中秋快乐!以前没散过分今天散点。 文档结构的问题 抢救,可以用vb.net写一个用户控件或动态库,在asp.net里调用吗? 请问大家一个问题 如何解压Linux下的.zip文件? 下接列表框的问题 来这里几天了,看大家都是很消极的,为什么? 可以动态增加<option>吗? datagird高手的问题! 数据库导入问题。在线等!急啊!!! 高手来帮忙 為何調用data module中的adoconnection會出錯。 怎样把几张jpg图转换成avi的文件 ★☆pb8异机连接sql server数据库的问题???50分献 菜鸟求问,急需回答!!! 有哪位高手知道 哪位同志能提供软件工程电子文档教程下载的站点给我 菜鸟问题 简单问题 ASP里流媒体上传问题 初学VC得困惑 用第三方类MultipartRequest上传文件时,怎样实现根据用户填写的表单来决定上传路径 当我插入一个usb设备,系统装好驱动后注册表会有变化吗? 如何解决BUTTON重入的问题。 关于如何获得文件域中的文件名!!!!!!!!!!!!!!!!! 游戏编程初学者的作品.(弹球) 有没有汨罗的朋友呀?????? 在线等,触发器如何使用? 请问ActiveX controls event发出的消息怎样在container里接收 蝙蝠是瞎子吗? 赡字组词 等腰三角形的腰长与底边长之比是5:6,底边上的高为4√3cm,求等腰三角形的周长与面积(要过程最好 已知a是一个有理数,|a|大于或等于0这一事件是必然事件还是随机事件?为什么? special中文是 谁有被亲人摸过小鸡鸡的故事我的鸡鸡被姐姐摸过 视频中声音沙哑的英文歌叫什么 "凛"可以组什么词语?谢谢了``有报酬` 仿写 :时间是___ 生命是___原题 :时间是一把刀,生命是一匹锦绮;一节一节地剪去,等到剪完的时候,把一堆破布付之一炬!时间是一根铁鞭,生命是一树繁花;一朵一朵的击落,等到击完的时候,把满 bring a coat home对吗 bring her home?bring her home or bring her to home or bring her to the home 巴西强盗入室抢漫画美国:电视仍占据儿童一半屏幕时间转基因食品争论 英法态度迥相异美一男子喝红牛饮料后死于心脏病 家人卢浮宫藏品首次来华公开展览 现地中海奥尔布赖特:中美关系发展至关键期应抓茶党加速美国政坛裂变 抓住政府软肋屡韩国9月经常项目收支连续20个月保持利比亚运钞车遭抢 劫匪抢走总计数千万英国广播公司被指诽谤英皇室哈里王子吸日本孤独人群增多朋友租赁登场 每小时滥罚“跨区域用盐”的昏哨别再吹了中国修改行诉法:行政机关负责人应出庭聚焦APEC:北京参考“奥运模式”力四中全会公报评论解读:党的领导是理解俄乌达成天然气协议 美国欢迎称是“积南昌市人大代表万华林被采取强制措施人大法工委:若遇执行难 被诉行政机关NBA-科比21+7+4 湖人惜败快全会公报评论解读:党的领导是理解中国首批221名APEC志愿者正式着装上墨西哥将动用无人机协助搜寻失踪学生我的女友是总裁魔法制霸龙渊成神记九龙封神记超级盗梦系统霸武独尊天地烈风大逆转1906艾尔维拉领主重装补给线走向光明永兴湖旅游水街旅游澎湖天后宫旅游望夫石旅游寺口旅游绿岛监狱旅游西子湖风景区旅游翠郊古民居旅游陶公岛旅游浅水湾乡村欢乐世界旅游妖女湖旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘