我对 Objective-C 的一些事情很好奇。比方说,下面这行代码:
[obj method:argument];
是不是类似于Windows WinAPI发送通过 SendMessage 提供的消息?或者:
SendMessage(obj, method, argument, NULL);
我很好奇,因为我非常精通 C/C++ 和 Windows Win32,但我只是在学习 Objective-C 并且我正在尝试了解它的消息传递系统
。也就是说,如果它类似于 SendMessage
在 Windows 中所做的,如果是这样,那么在 Objective-C 中这种“调用”方法的过程对于 C/C++。我错了吗?
最佳答案
Objective-C 消息传递略有不同。消息没有放入队列(PostMessage)中,然后由操作系统提供服务,它们直接在相关类上执行(或多或少类似于 SendMessage),因此它们通常比 Windows 消息快一点,如果你认为大多数Windows 消息是发布的,而不是直接发送的。
调用 Objective-C 中的方法意味着搜索方法的名称,这会产生一个唯一的标识符,即选择器。这种搜索通常可以在编译时完成。查询类是否实现了该选择器,如果实现了,则使用适当的参数调用对应的代码。如果不存在,则抛出异常(参见 Bryan Chen 的评论)。如果调用该方法的实例为 nil,则它会被忽略。
如您所见,这或多或少类似于 Windows SendMessage 的工作方式,但不完全相似。
正如评论所说,它比 C++ 中的成员函数调用慢(相当多),甚至比调用虚函数还慢。
更多信息可以在 Objective-C runtime reference 中找到.
关于Objective-C 消息传递系统与微软的 WinAPI 消息传递系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24442082/