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