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

标签 objective-c c winapi

我对 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/

相关文章:

c++ - 阴影的窗口样式?

c - 为 Pthreads 移植 GNU Pth 代码有什么注意事项吗?

c++ - 如何编写一个可重复的伪随机数生成器?

objective-c - Swift 和 Xcode 6.1 的布局问题

ios - UILabel上的应用程序名称

c - 拥有二进制文件有什么用?

c++ - 按顺时针顺序排列坐标

c - #define ISR(x) #pragma isr=x

linux - linux 中 whereis 命令的 API

c - 按需读取,如何在不下载的情况下从在线大文件中读取前256字节?