我对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 ++来说可能相对较慢。我错了吗?
答案 0 :(得分:2)
Objective-C消息传递略有不同。消息不会放入队列(PostMessage),然后由OS提供服务,它们直接在相关类(或多或少像SendMessage)上执行,因此它们通常比Windows消息快一点,如果你最重视的话Windows消息已发布,而不是直接发送。
在Objective-C中调用方法意味着搜索方法的名称,这会产生唯一标识符,选择器。这种搜索通常可以在编译时完成。如果它实现了该选择器,则查询该类,如果是,则使用适当的参数调用相应的代码。如果它不存在,则抛出异常(参见Bryan Chen的评论)。如果调用该方法的实例为nil,则忽略它。
如您所见,这或多或少类似于Windows SendMessage的工作原理,但并非完全相同。
正如评论所说,它比C ++中的成员函数调用(相当多)慢,甚至比调用虚函数慢。
Objective-C runtime reference可以找到更多内容。