Objective-C消息机制的原理
来源:互联网 发布:淘宝游戏专营店铺卖家? 编辑:程序博客网 时间:2024/05/17 22:17
在Objective-C中,message与方法的真正实现是在执行阶段绑定的,而非编译阶段。编译器会将消息发送转换成对objc_msgSend方法的调用。
objc_msgSend方法含两个必要参数:receiver、方法名(即:selector),如:
[receiver message]; 将被转换为:objc_msgSend(receiver, selector);
objc_msgSend方法也能hold住message的参数,如:
objc_msgSend(receiver, selector, arg1, arg2, …);
objc_msgSend方法会做按照顺序进行以下操作,以完成动态绑定:
- 查找selector所指代的程序(方法的真正实现)。因为不同类对同一方法有不同的实现,所以对方法的真正实现的查找依赖于receiver的类
- 调用该实现,并将一系列参数传递过去
- 将该实现的返回值作为自己的返回值,返回之
消息传递的关键是,编译器构建每个类和对象时所采用的数据结构。每个类都包含以下两个必要元素:
- 一个指向父类的指针
- 一个调度表(dispatch table)。该调度表将类的selector与方法的实际内存地址关联起来
每个对象都有一个指向所属类的指针isa。通过该指针,对象可以找到它所属的类,也就找到了其全部父类,如下图所示:
当向一个对象发送消息时,objc_msgSend方法根据对象的isa指针找到对象的类,然后在类的调度表(dispatch table)中查找selector。如果无法找到selector,objc_msgSend通过指向父类的指针找到父类,并在父类的调度表(dispatch table)中查找selector,以此类推直到NSObject类。一旦查找到selector,objc_msgSend方法根据调度表的内存地址调用该实现。通过这种方式,message与方法的真正实现在执行阶段才绑定。
为了保证消息发送与执行的效率,系统会将全部selector和使用过的方法的内存地址缓存起来。每个类都有一个独立的缓存,缓存包含有当前类自己的selector以及继承自父类的selector。查找调度表(dispatch table)前,消息发送系统首先检查receiver对象的缓存。
缓存命中的情况下,消息发送(messaging)比直接调用方法(function call)只慢一点点点点。
0 0
- Objective-C消息机制的原理
- Objective-C消息机制的原理
- Objective-C消息机制的原理
- Objective-C消息机制的原理
- Objective-C消息机制的原理
- Objective-C消息机制的原理
- Objective-C消息机制的原理
- Objective-C消息机制的原理
- Objective-C消息机制的原理
- Objective-C消息机制的原理
- Objective-C消息机制的原理
- Objective-C消息机制的原理
- [Objective-C]消息机制工作原理
- iOS Objective-C 消息机制原理
- Objective-C的消息机制
- Objective-C消息机制
- Objective-C的消息(message)工作机制
- Objective-C的消息传递机制
- 遍历Map的四种方法
- Postgresql数据库数据简单的导入导出
- MongoDB win7 下安装
- 双击不选中文本
- c语言之二级指针
- Objective-C消息机制的原理
- 移动web开发框架研究
- OCCI处理CHAR类型字符串变量的不同
- cad常用系统变量
- 树莓派的玩具:用三轴加速度计来控制web页面上的飞机姿态
- Android实用代码七段(一)
- 重载prototype之后
- Android WebView J Should not happen: no rect-based-test nodes found
- 一些有用的机器学习、图像处理、深度学习等网站