博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Effective Objective-C 2.0 — 第11条:理解 objc_msgSend 的作用
阅读量:6403 次
发布时间:2019-06-23

本文共 1756 字,大约阅读时间需要 5 分钟。

  • 消息由接受者、选择子及参数构成。给某对象“发送消息” (invoke a message) 也就相当于在该对象上“调用方法”(call a method)
  • 发给某对象的全部信息都要由“动态消息派发系统”(dynamic message dispatch system)来处理,该系统会查出对应的方法,并执行其代码。

 

在对象上调用方法,也可以叫做“传递消息”

消息:name 或 selector         可以接受参数,而且还有返回值

OC是C的超集,C 语言使用“静态绑定”(static binding),即在编译期就能决定运行时所应调用的函数。编译器在编译代码的时候就已经知道程序中有printHello 与printGoodbye 这两个函数了

#import 
void printHello() { printf ("Hello World!\n");}void printGoodbye() { pirntf ("Goodbye, World!\n");}void doTheThing(int type) { if (type == 0) { printHello (); } else { printGoodbye(); } return 0;}

若是这样:

#import 
void printHello() { printf ("Hello World!\n");}void printGoodbye() { pirntf ("Goodbye, World!\n");}void doTheThing(int type) { void (*fnc) (); if (type == 0) { fnc = printHello; } else { fnc = printGoodbye; } fnc(); return 0;}

这就是 动态绑定 (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函数 其原型:

Class_selector(id self, SEL _cmd, ...)

每个类都有一张表格,其中的指针都会指向这种函数,而选择子的名称则是查表时所用的“键”。   objc_msgSend等函数正是通过这张表格来寻找应该执行的方法并跳至其实现的。

 

转载于:https://www.cnblogs.com/IDRI/p/5130027.html

你可能感兴趣的文章
python 提取主域名和子域名代码——先根据规则提取,如果有问题,则使用tldextract...
查看>>
漂亮的后台 模板
查看>>
数据挖掘学习08 - 实验:使用R评估kmeans聚类的最优K
查看>>
git配置
查看>>
灵活定义神经网络结构
查看>>
java10 WeakHashMap
查看>>
CentOS7下安装mysql5.6修改字符集为utf8并开放端口允许远程访问
查看>>
ElasticSearch入门 第二篇:集群配置
查看>>
Solr开发文档
查看>>
关于Python Package下的Module import方式[转]
查看>>
对于key的操作命令
查看>>
MySQL · 捉虫动态 · 字符集相关变量介绍及binlog中字符集相关缺陷分析
查看>>
.Net Discovery系列之十一-深入理解平台机制与性能影响 (中)
查看>>
在Visual Studio引用对话框中找不到Civil 3D 2011 64位的COM组件的解决办法
查看>>
JS组件系列——自己动手扩展BootstrapTable的 冻结列 功能:彻底解决高度问题
查看>>
用 IIS 搭建 mercurial server
查看>>
git常见操作--忽略文件以及常用命令【转】
查看>>
DotNET企业架构应用实践-数据库表记录的唯一性设计的设计兼议主键设定原则
查看>>
设备树网址【原创笔记】
查看>>
Android -- ListView与ArrayAdapter、SimpleAdapter
查看>>