[Objective-C] send message 和 call method 的区别

转载 2015年07月08日 17:16:25

参考:

http://stackoverflow.com/questions/2852381/calling-a-method-or-sending-a-message-in-objective-c

http://davedelong.tumblr.com/post/58428190187/an-observation-on-objective-c


Call method:

明确指定对哪个 object 执行哪个 method,执行时,在 object 在内存中的地址做固定的偏移找到 method 的代码,执行。效率高,但没有灵活性

根据Dave的说法,call method 相当于是”主动语态“,明确知道哪个 object 的哪个 method 被执行


Send message:

绝大多数情况下,[anObject doMethod:aParameter]; 和 C++ 中的 anObject->doMethod(aParameter); 的功能是一样的

然而,[anObject doMethod:aParameter]; 会被编译器翻译成 objc_msgSend(anObject, @selector(doMethod:), aParameter);

最终执行 method 的 object 未必是 anObject,最终执行的 method 也未必是 anObject 的 doMethod

objc_msgSend() 方法会在它的 method list 中做动态查询。比如,程序员可以修改该 method list,使得本该执行 selector A 的 method 的地方实际执行 selector B 的 method。object 可以判断它是否接受这个 method、是否将这个 method forward 给其他 object、是否对某个 method 执行不同的代码。

理论上,send message 会比 call method 慢一些,事实上,每次 send message 只比 call method 慢几纳秒,很微小。但是带来了很大的灵活性

根据Dave的说法,send message 相当于是”被动语态“,关注点在于”执行method“,只要 method 被执行就可以了,不关心哪个 object 执行的。 



MFC的SendMessage函数详解

SendMessage函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队...
  • piaopiaopiaopiaopiao
  • piaopiaopiaopiaopiao
  • 2014年06月22日 14:28
  • 5634

SendMessage用法

进来看一下 1.新建一个Dialog  based的MFC工程MSG 2.在资源管理器中打开对话框IDD_MSG_DIALOG,在其中放置一下控件:   (1)ID号为ID_SENDMS...
  • ksq2010
  • ksq2010
  • 2012年12月04日 11:03
  • 33402

handler中send和post方法的区别

在Android中handler用来进行进程间通信,其中有send和post两种方法,大家常用的send方法,其是在工作线程中处理完耗时操作后调用handler的sendMessage(message...
  • DHmack
  • DHmack
  • 2016年03月29日 22:09
  • 2348

Dubbo通信模型

Dubbo通信模型
  • qq418517226
  • qq418517226
  • 2016年07月19日 21:01
  • 5487

微信开发 获取Token、主动给企业成员发送消息

package com.synale.test; import java.io.ByteArrayInputStream; import java.io.InputStream; import j...
  • chenyongtu110
  • chenyongtu110
  • 2015年06月02日 10:27
  • 2093

javamail 的使用

1. 相关类    InternetAddress 地址
  • aj251
  • aj251
  • 2014年04月26日 23:51
  • 460

微信接口整理

1.获取access_token http请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_cred...
  • qq_19244423
  • qq_19244423
  • 2015年08月06日 11:28
  • 2360

RocketMQ——Producer篇:发送顺序消息

顺序消息主要是指局部顺序,即生产者通过将某一类消息发送至同一个队列来实现。与发生普通消息相比,在发送顺序消息时要对同一类型的消息选择同一个队列,即同一个MessageQueue对象。 目前Rocke...
  • meilong_whpu
  • meilong_whpu
  • 2017年08月09日 08:56
  • 253

Kafka Producer同步模式发送message源码分析

先把几个比较重要的方法列出来 // 入口,处理 message及messages   def handle(events: Seq[KeyedMessage[K,V]]) //处理序列化的K...
  • chrischen214
  • chrischen214
  • 2014年02月25日 18:45
  • 10126

Netty 5.0 用户指南(持续翻译中,未完成)

原文链接:http://netty.io/wiki/user-guide-for-5.x.html 前言 问题的提出 Nowadays we use general purpose applic...
  • hanit
  • hanit
  • 2014年01月15日 10:51
  • 2531
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Objective-C] send message 和 call method 的区别
举报原因:
原因补充:

(最多只允许输入30个字)