第11条:理解objc_msgSend的作用
C语言使用“静态绑定”,也就是说,在编译期就能决定运行时所应调用的函数(也就是说函数地址硬编码在指令之中)。
如果是内联函数,就无法硬编码在指令之中,而是要在运行期读取出来(也就是动态绑定)。
在底层,所有方法都是普通的C函数。
OC对象的每个方法都可以视为简单的C函数。
<return_type> Class_selector(id self, SEL _cmd, parameter.....);
动态绑定由编译器转换成一条C语言函数,所调用的函数乃是消息传递机制中的核心函数,叫做objc_msgSend;
void objc_msgSend(id self, SEL cmd, parameter.....) 该方法在接收者所属类中搜寻“方法列表”(并将结果缓存在“快速映射表”(fast map)里面,每个类都有这样一块缓存,为加快执行速率),找到则跳至实现代码,找不到延继承体系继续向上查找,最终如果还是找不到,就执行“消息转发”操作。
其他函数:
objc_msgsend_stret。 待发送的消息要返回结构体,可由此函数处理(前提条件是:CPU 寄存器能容纳下这个结构体。否则将由另一个函数(通过分配在栈上的某个变量来处理消息所返回的结构体)执行派发)。
objc_msgsend_fpret。待发送的消息返回的是浮点数,可由此函数处理。(用来处理 x86等架构 CPU中的某些特殊情况)
objc_msgsend_SendSuper。给超类发消息。由此函数处理。还有两个与objc_msgsend_stret和objc_msgsend_fpret等效的函数,用于处理发给 super 的相应消息。
尾调用优化(“tail-call optimization”, 也叫尾递归优化),只有当函数的最后一个操作仅仅是调用其他函数而不会将其返回值另作他用时,才能执行“尾调用优化”。(防止栈溢出(stack overflow)现象)
尾调用优化技术,这项优化对 objc_msgSend 非常关键,令“跳至方法实现”这一操作变得更简单些。
第11条:理解objc_msgSend的作用的更多相关文章
- Effective Objective-C 2.0 — 第11条:理解 objc_msgSend 的作用
消息由接受者.选择子及参数构成.给某对象“发送消息” (invoke a message) 也就相当于在该对象上“调用方法”(call a method) 发给某对象的全部信息都要由“动态消息派发系统 ...
- 第十一条理解objc_masgSend的作用
Objetive-C最基本的的东西就是它的消息机制.Objective-C运行时的最基本的东西就是 objc_msgSend, 它就是负责发送一个消息给对象的C函数. 当你写下面这样的代码时: ...
- SmartbBear给出的11条代码审查最佳实践
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:SmartbBear给出的11条代码审查最佳实践.
- 核心思想:决定你是富人还是穷人的11条标准(有强烈的赚钱意识,这也是他血液里的东西,太精彩了)good
原文地址:决定你是富人还是穷人的11条标准作者:谢仲华 1.自我认知 穷人:很少想到如何去赚钱和如何才能赚到钱,认为自己一辈子就该这样,不相信会有什么改变. 富人:骨子里就深信自己生下来不是要做穷人, ...
- go笔记--几个例子理解context的作用
目录 go笔记--几个例子理解context的作用 context interface 先看一个简单的例程 context的作用 contxt相关函数 go笔记--几个例子理解context的作用 经 ...
- 总结了11条,我对Python 装饰器的理解
对于每一个学习 Python 的同学,想必对 @ 符号一定不陌生了,正如你所知, @ 符号是装饰器的语法糖,@符号后面的函数就是我们本文的主角:装饰器. 装饰器放在一个函数开始定义的地方,它就像一顶帽 ...
- 我搭的神经网络不work该怎么办!看看这11条新手最容易犯的错误
1. 忘了数据规范化 2. 没有检查结果 3. 忘了数据预处理 4. 忘了正则化 5. 设置了过大的批次大小 6. 使用了不适当的学习率 7. 在最后一层使用了错误的激活函数 8. 网络含有不良梯度 ...
- iOS-@inerface的11条规范写法
总结一些interface声明时的规范,相关宏的介绍,定义方法时有用的修饰符,编写注释的规范,最终写出一个合格的头文件. 1.读写权限 1.1实例变量的@public,@protected,@priv ...
- @inerface的11条规范写法
总结一些interface声明时的规范,相关宏的介绍,定义方法时有用的修饰符,编写注释的规范,最终写出一个合格的头文件. 1.读写权限 1.1实例变量的@public,@protected,@priv ...
随机推荐
- [有错误]堆排序的实现 java
#include<iostream> using namespace std; //大根堆,从小到达排序 ]; void swap(int &a,int &b) { a=a ...
- IP头部校验(转)
一:原理 当发送IP包时,需要计算IP报头的校验和: 1.把校验和字段置为0: 2.对IP头部中的每16bit进行二进制求和: 3.如果和的高16bit不为0,则将和的高16bit和低16bit反复相 ...
- advanced dom scripting dynamic web design techniques Part One DOM SCRIPTING IN DETAIL CHAPTER 1 DO IT RIGHT WITH BEST PRACTICES
You’re excited; your client is excited. All is well. You’ve just launched the client’s latest websit ...
- JSON ,JSONArray和JSONObject
和 XML 一样,JSON 也是基于纯文本的数据格式.由于 JSON 天生是为 JavaScript 准备的,因此,JSON 的数据格式非常简单,可以用 JSON 传输一个简单的 String,Num ...
- 通过WMI配置IP
$wmi = gwmi win32_networkadapterconfiguration -filter "ipenabled = 'true'"$wmi.EnableStati ...
- java基础之synchronized使用方法
首先.參考文章:http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html PS:參考文章非常长,但内容非常丰富,若是刚開始学习 ...
- Android开发书籍推荐
当你看到这些文字时,那么恭喜你,你可能选择了一个无限可能的方向. Android,Google出品,信誉保证,你值得深入研究. 学习一样新事物或许有多种方式,报培训班,看视频,向高手请教等等,但一本好 ...
- DELPHI TDownLoadURL下载网络文件
DELPHI XE6 FMX 附件:http://files.cnblogs.com/xe2011/IDHttp_fmx.7z unit Unit1; interface uses //引用 Vc ...
- 安装64位ubuntu 14.04-搭建android开发环境
end
- centos 6.3安装mono和monoDevelop过程
Mono官方网站:http://www.mono-project.com MonoDevelop官方网站:http://monodevelop.com/ 注:整个安装过程最好在同一个终端下完成! 1. ...