您的位置:首页 > 移动开发 > Objective-C

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

2015-07-08 17:16 453 查看
参考:

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 执行的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: