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.自我认知 穷人:很少想到如何去赚钱和如何才能赚到钱,认为自己一辈子就该这样,不相信会有什么改变. 富人:骨子里就深信自己生下来不是要做穷人, ...
随机推荐
- dede使用方法---用js让当前导航高亮显示
当前导航高亮显示能够提升用户体验,我也知道,大家在网上搜dede让当前导航高亮显示的方法一抓一大把,但是,并不一定适合自己的需求.就像我的需求一样,导航有个二级导航,然后需要做到让当前导航高亮显示.我 ...
- js 时间与时间戳的转换
一:时间转时间戳:javascript获得时间戳的方法有四种,都是通过实例化时间对象 new Date() 来进一步获取当前的时间戳 1.var timestamp1 = Date.parse(n ...
- 解决bind错误 bind: Address already in use
关于bind错误的处理: bind: Address already in use 原因: 操作系统没有立即释放端口 解决一: 等待一段时间运行网络程序即可 解决二:通过setsockopt进行设置, ...
- oracle11g 拆分字符串的详细技巧
转自:http://m.blog.csdn.net/article/details?id=51946573 <-->功能需求 有一个比较长的SQL语句,查询 ...
- jquery插件-表单验证插件-demo
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【poj1260】 Pearls
http://poj.org/problem?id=1260 (题目链接) 题意 购买珍珠,所有珍珠分成n个档次,第i个档次购买每个珍珠的价格为p[i],需要购买第i档次的珍珠a[i]个.若要购买第i ...
- 【poj1568】 Find the Winning Move
http://poj.org/problem?id=1568 (题目链接) 题意 两人下4*4的井字棋,给出一个残局,问是否有先手必胜策略. Solution 极大极小搜索.. 这里有个强力优化,若已 ...
- Linq Like
Like的操作,有点像in,但是,方向变了.什么意思呢.就是你给定一个字符串,去寻找数据中某个字段包含这个字符串.就是给定的字符串是某字段的子集.Sql Script是这么写的. Selec * fr ...
- NuGet在Push的时候提示“远程服务器返回错误:(403)已禁用”问题解决
在使用NuGet把包push到nuget官网的时候,提示了如下信息: Failed to process request. 'The specified API key is invalid or d ...
- POJ 3061 Subsequence(尺取法)
题目链接: 传送门 Subsequence Time Limit: 1000MS Memory Limit: 65536K 题目描述 给定长度为n的数列整数以及整数S.求出总和不小于S的连续子 ...