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



阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭