【问题标题】:What is the equivalent (if any) to the C++/Windows SendMessage() on the Mac?Mac 上的 C++/Windows SendMessage() 等价物(如果有的话)是什么?
【发布时间】:2009-06-01 00:39:58
【问题描述】:

Mac OS 中是否有与SendMessage 等效的功能?

【问题讨论】:

  • 如果您能就您需要 SendMessage 的原因或您想要实现的目标提供更多解释,这将有所帮助。这个问题太模糊了。

标签: c++ objective-c windows macos


【解决方案1】:

具有讽刺意味的是,Objective-C 中的每个方法调用都相当于 SendMessage。 Objective-C 本质上是一个消息传递系统。

所以你就说:

[window myMessage]

myMessage 例程将通过将 myMessage 传递给 Window 对象并让它处理该方法来执行...

也可能更接近您真正想做的事情是使用通知在组件之间发送消息。

如果您在编译时没有 Window 对象,编译器可能会抱怨它不知道 Window 是否可以处理您发送的消息。对于这些情况,您可以使用:

[window performSelector:@selector(myMessage)]

此调用的其他版本允许将对象作为参数传递。

【讨论】:

  • 不知道你为什么称之为讽刺,但它肯定是正确的答案:) SendMessage 的整个概念只是一种以最拜占庭式的、过度劳累的方式实现动态调度的方法。当然,与所有其他形式的消息发送相比,它的速度非常慢。
  • 过去很慢,这就是几亿美元的研发资金为您提供的语言。现在,如果只有其他语言有像 ARC 一样快的东西来进行正确的内存管理......
【解决方案2】:

这取决于您使用 SendMessage() 发送的消息。例如,Cocoa 中的大多数事件都通过-[NSApplication sendEvent:],或者如果您想要较低级别的版本,则通过SendEventToEventTarget()。对于其他消息,例如调整大小、移动等,您需要查看 NSWindow(例如-setFrame:animated:)或 NSApplication 的适当方法。

一般来说,不像 SendMessage() 那样使用漏斗例程和函数常量,在 Cocoa 中,您只需获取相关对象并调用其方法即可。

【讨论】:

    【解决方案3】:

    在更高层次上,如果您谈论的是 Carbon 事件管理器,您将使用函数“SendEventToEventTarget”

    http://developer.apple.com/documentation/Carbon/Reference/Carbon_Event_Manager_Ref/Reference/reference.html

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 2017-04-04
      • 1970-01-01
      • 2010-11-15
      • 2020-06-20
      • 1970-01-01
      • 2017-06-15
      • 2014-05-08
      • 1970-01-01
      相关资源
      最近更新 更多