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

参考:

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 执行的。 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值