• 消息由接受者、选择子及参数构成。给某对象“发送消息” (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 的作用的更多相关文章

  1. 第11条:理解objc_msgSend的作用

    C语言使用“静态绑定”,也就是说,在编译期就能决定运行时所应调用的函数(也就是说函数地址硬编码在指令之中). 如果是内联函数,就无法硬编码在指令之中,而是要在运行期读取出来(也就是动态绑定). 在底层 ...

  2. 第十一条理解objc_masgSend的作用

    Objetive-C最基本的的东西就是它的消息机制.Objective-C运行时的最基本的东西就是 objc_msgSend, 它就是负责发送一个消息给对象的C函数.   当你写下面这样的代码时:   ...

  3. Effective Objective-C 2.0 — 第12条:理解消息转发机制

    11 条讲解了对象的消息传递机制 12条讲解对象在收到无法解读的消息之后会发生什么,就会启动“消息转发”(message forwarding)机制, 若对象无法响应某个选择子,则进入消息转发流程. ...

  4. 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 ...

  5. SmartbBear给出的11条代码审查最佳实践

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:SmartbBear给出的11条代码审查最佳实践.

  6. PSU 离11.2.0.3.0 -&gt; 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 ...

  7. 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 ...

  8. PEACHPIE 0.9.11 版本发布,可以上生产了

    PeachPie在官方博客(https://www.peachpie.io/2018/10/release-0911-visual-studio.html)发布了PeachPie的0.9.11版本 - ...

  9. 核心思想:决定你是富人还是穷人的11条标准(有强烈的赚钱意识,这也是他血液里的东西,太精彩了)good

    原文地址:决定你是富人还是穷人的11条标准作者:谢仲华 1.自我认知 穷人:很少想到如何去赚钱和如何才能赚到钱,认为自己一辈子就该这样,不相信会有什么改变. 富人:骨子里就深信自己生下来不是要做穷人, ...

随机推荐

  1. WordPress的have_posts()和the_post()用法解析

    原文地址:http://www.phpvar.com/archives/2316.html 网上找到一篇介绍WordPress的have_posts()和the_post()用法解析的文章,觉得不错! ...

  2. C# 图片超过指定大小将压缩到指定大小不失真

    using System;using System.Collections.Generic;using System.Drawing;using System.Drawing.Drawing2D;us ...

  3. js 客户端如何判断浏览器是否暗转Flash

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  4. 【HDU 3746】Simpsons’ Hidden Talents(KMP求循环节)

    求next数组,(一般有两种,求循环节用的见代码)求出循环节的长度. #include <cstdio> #define N 100005 int n,next[N]; char s[N] ...

  5. &nbsp;兼容性问题

    直接在html文档中使用 来表示空格,在不同浏览器中的占位大小是不一样的. 因为不同浏览器默认的字体是不一样的,不同字体下的空格表示 占位大小不一致. 我们对 指定使用同样的字体就能让 显示同样的占位 ...

  6. 【BZOJ-1086】王室联邦 分块 + 块状树

    1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1094  Solved: ...

  7. 【bzoj1014】 JSOI2008—火星人prefix

    http://www.lydsy.com/JudgeOnline/problem.php?id=1014 (题目链接) 题意 给出一个字符串,要求维护这些操作:询问后缀x与后缀y的LCQ(最长公共前缀 ...

  8. Windows 8及以上系统安装好SQL Server 2008之后找不到SQL Server配置管理器的问题

    直接的方法: 打开[运行]->输入[C:\Windows\SysWOW64\mmc.exe /32 C:\Windows\SysWOW64\SQLServerManager10.msc]即可. ...

  9. 加州大学伯克利分校Stat2.2x Probability 概率初步学习笔记: Midterm

    Stat2.2x Probability(概率)课程由加州大学伯克利分校(University of California, Berkeley)于2014年在edX平台讲授. PDF笔记下载(Acad ...

  10. sql server 判空查询

    SELECT * FROM tableName WHERE columnName IS NOT NULL --排除空值 SELECT * FROM tableName WHERE ISNULL(col ...