从C函数回调中访问ObjC对象

时间:2011-06-02 19:43:37

标签: objective-c c callback

我正在玩Carbon的全球热键,我注册了一个热键。按下热键时,会调用此函数:

OSStatus myHotKeyHandler(EventHandlerCallRef nextHandler, EventRef anEvent, void *userData) {
    ...
}

此功能与我的app delegate定义位于同一文件中。我现在如何在该函数中调用我的委托上的ObjC方法?

[self aMethod];

我无法将一个void*(作为我的类实例的指针)添加到C函数中,因为我不是那个调用它的人。

我尝试将方法转换为类方法,然后使用[AppDelegate aFunction]调用它,这可以工作但我不能使用我的实例变量!

3 个答案:

答案 0 :(得分:8)

你正在重新发明轮子。使用包装器:

http://github.com/davedelong/DDHotKey

也许不是 wheel ,因为热键不是“琐碎的”#34;概念。也许你正在重塑差异?或者其他的东西? ;)

答案 1 :(得分:5)

在注册事件处理程序时,将指向类实例的指针作为userData的参数。然后,您将此指针作为userData返回到处理程序内。

答案 2 :(得分:3)

示例代码

InstallApplicationEventHandler(&MyHotKeyHandler,1,&eventType,(void *)self,NULL);
...

OSStatus MyHotKeyHandler(EventHandlerCallRef nextHandler,EventRef theEvent,
                         void *userData)
{
    [(yourAppDelegate *)userData dosomething];
}