Objective-C消息传递系统与Microsoft的WinAPI消息传递

时间:2014-06-26 23:57:48

标签: objective-c c winapi

我对Objective-C的某些事情感到好奇。比如说,以下代码行:

[obj method:argument];

是否与发送通过Windows WinAPI提供的消息的SendMessage类似?或者:

SendMessage(obj, method, argument, NULL);

我很好奇,因为我非常精通C / C ++和Windows Win32,但我只是在学习Objective-C而我正在尝试理解它的message passing system。也就是说,如果它类似于SendMessage在Windows中的作用,如果是这样的话,那么在Objective-C中“调用”方法的过程对于C / C ++来说可能相对较慢。我错了吗?

1 个答案:

答案 0 :(得分:2)

Objective-C消息传递略有不同。消息不会放入队列(PostMessage),然后由OS提供服务,它们直接在相关类(或多或少像SendMessage)上执行,因此它们通常比Windows消息快一点,如果你最重视的话Windows消息已发布,而不是直接发送。

在Objective-C中调用方法意味着搜索方法的名称,这会产生唯一标识符,选择器。这种搜索通常可以在编译时完成。如果它实现了该选择器,则查询该类,如果是,则使用适当的参数调用相应的代码。如果它不存在,则抛出异常(参见Bryan Chen的评论)。如果调用该方法的实例为nil,则忽略它。

如您所见,这或多或少类似于Windows SendMessage的工作原理,但并非完全相同。

正如评论所说,它比C ++中的成员函数调用(相当多)慢,甚至比调用虚函数慢。

Objective-C runtime reference可以找到更多内容。