Effective Objective-C 2.0 — 第11条:理解 objc_msgSend 的作用
- 消息由接受者、选择子及参数构成。给某对象“发送消息” (invoke a message) 也就相当于在该对象上“调用方法”(call a method)
- 发给某对象的全部信息都要由“动态消息派发系统”(dynamic message dispatch system)来处理,该系统会查出对应的方法,并执行其代码。
在对象上调用方法,也可以叫做“传递消息”
消息:name 或 selector 可以接受参数,而且还有返回值
OC是C的超集,C 语言使用“静态绑定”(static binding),即在编译期就能决定运行时所应调用的函数。编译器在编译代码的时候就已经知道程序中有printHello 与printGoodbye 这两个函数了
#import <stdio.h>
void printHello() {
printf ("Hello World!\n");
}
void printGoodbye() {
pirntf ("Goodbye, World!\n");
}
void doTheThing(int type) {
if (type == ) {
printHello ();
} else {
printGoodbye();
}
return ;
}
若是这样:
#import <stdio.h>
void printHello() {
printf ("Hello World!\n");
}
void printGoodbye() {
pirntf ("Goodbye, World!\n");
}
void doTheThing(int type) {
void (*fnc) ();
if (type == ) {
fnc = printHello;
} else {
fnc = printGoodbye;
}
fnc();
return ;
}
这就是 动态绑定 (dynamic binding), 待调用的函数无法硬编码在指令之中,而是要在运行期读取出来。
在Objective-C在中, 如果向某对象传递消息,那就会使用动态绑定机制来决定需要调用的方法。在底层都是普通的C语言函数, 然而对象受到消息之后,究竟该调用哪个方法则完全于运行期决定,甚至可以在程序云心时改变,这些特性使OC 称为一门真正动态语言
给对象发送消息如下:
id returnValue = [someObject messageName:parameter];
someObject :接受者、receiver
messageName:选择子、selector
选择子与参数合起来称为”消息“(message)
编译器将消息转换成C语言函数调用,所调用函数乃是消失机制中的核心函数 objc-msgSend,其原型(prototype)如下:
void objc_msgSengd(id self, SEL cmd, ...)
第一个参数代表接受者,第二个参数代表选择子(SEL是选择子的类型)
id returnValue = objc_msgSend(someObject, @selector(messageName:), parameter);
其他函数:
objc_msgSend_stret: 如果待发送的消息要返回结构体,那么可交由此函数处理。
objc_msgSend_fpret:如果消息返回的是浮点数,可交由此函数处理。
objc_msgSendSuper:给超类发消息。
Objective-C 对象的每个方法都可以视为简单的C函数 其原型:
<return_type> Class_selector(id self, SEL _cmd, ...)
每个类都有一张表格,其中的指针都会指向这种函数,而选择子的名称则是查表时所用的“键”。 objc_msgSend等函数正是通过这张表格来寻找应该执行的方法并跳至其实现的。
Effective Objective-C 2.0 — 第11条:理解 objc_msgSend 的作用的更多相关文章
- 第11条:理解objc_msgSend的作用
C语言使用“静态绑定”,也就是说,在编译期就能决定运行时所应调用的函数(也就是说函数地址硬编码在指令之中). 如果是内联函数,就无法硬编码在指令之中,而是要在运行期读取出来(也就是动态绑定). 在底层 ...
- 第十一条理解objc_masgSend的作用
Objetive-C最基本的的东西就是它的消息机制.Objective-C运行时的最基本的东西就是 objc_msgSend, 它就是负责发送一个消息给对象的C函数. 当你写下面这样的代码时: ...
- Effective Objective-C 2.0 — 第12条:理解消息转发机制
11 条讲解了对象的消息传递机制 12条讲解对象在收到无法解读的消息之后会发生什么,就会启动“消息转发”(message forwarding)机制, 若对象无法响应某个选择子,则进入消息转发流程. ...
- Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8)
Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8) 本次演示为升级oracle rac数据库,用GI的psu升级,从11.2.0.4.0升级到11.2.0.4.8 ...
- SmartbBear给出的11条代码审查最佳实践
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:SmartbBear给出的11条代码审查最佳实践.
- PSU 离11.2.0.3.0 -> 11.2.0.3.11 如果解决冲突的整个
Oracle rdbms 扑灭psu离11.2.0.3.0升级到11.2.0.3.11 参考patch :18522512 停止应用,停止听音乐并DB,将db的oracle_home在下面OPatch ...
- Oracle DataGuard 升级 [11.2.0.1 -> 11.2.0.4]
Oracle DataGuard 升级 [11.2.0.1 -> 11.2.0.4] Primary: 11.2.0.1 单机,Site A. Standby: 11.2.0.1 单机,Site ...
- PEACHPIE 0.9.11 版本发布,可以上生产了
PeachPie在官方博客(https://www.peachpie.io/2018/10/release-0911-visual-studio.html)发布了PeachPie的0.9.11版本 - ...
- 核心思想:决定你是富人还是穷人的11条标准(有强烈的赚钱意识,这也是他血液里的东西,太精彩了)good
原文地址:决定你是富人还是穷人的11条标准作者:谢仲华 1.自我认知 穷人:很少想到如何去赚钱和如何才能赚到钱,认为自己一辈子就该这样,不相信会有什么改变. 富人:骨子里就深信自己生下来不是要做穷人, ...
随机推荐
- Android开源项目
Android开源项目第一篇——个性化控件(View)篇 Android开源项目第二篇——工具库篇 Android开源项目第三篇——优秀项目篇 Android开源项目第四篇——开发及测试工具篇 And ...
- slim
Slim 是一个非常优雅的 PHP 微框架,非常适合做API,支持多种http请求方式,比如get,post,delete,put等 安装使用Composer composer require sli ...
- 生活就像测试, BUG会越来越少,生活会越来越好!
生活就像测试, BUG会越来越少,生活会越来越好!
- 谷歌console开发人员官方文档(注意是谷歌)
https://developers.google.com/web/tools/chrome-devtools/debug/console/console-ui?hl=en#opening-the-c ...
- 使用oracle utl_http包需要注意的事项
总结下几次使用utl_http包遇到的几个问题 关于utl_http包功能还是很强大的 可以通过他来捕捉网站页面的内容 或者调用一个url的接口完成某项功能 Eg: declare req UT ...
- 翻滚吧,Spark (错误记录)
1) 本地运行报错: Exception in thread "main" org.apache.spark.SparkException: A master URL must b ...
- break 的一个“高级用法”(转)
转载:http://blog.csdn.net/lovelan1748/article/details/5321558 本小节不是很适于没有多少实际编程经历的初学者,所以初学者可以跳过,以后再回头阅读 ...
- 【BZOJ-2521】最小生成树 最小割
2521: [Shoi2010]最小生成树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 415 Solved: 242[Submit][Statu ...
- SVN中(trunk tags branches)的使用理解
trunk--主干(永远都是最新的,每发布一个版本会在tags和branches上进行分支) tags-标签(只读,用于存放发布后的文件冻结,以及对应发布后版本的源文件:可以是来自主干或者分支的发布: ...
- USACO 3.4 Electric Fence 皮克定理
题意:在方格纸上画出一个三角形,求三角形里面包含的格点的数目 因为其中一条边就是X轴,一开始想的是算出两条边对应的数学函数,然后枚举x坐标值求解.但其实不用那么麻烦. 皮克定理:给定顶点坐标均是整点( ...