3

我正在将 Objective-C 部分混合到一个 C++ 项目中(请不要为此争论,它是跨平台的)。
我现在想在可可环境中的正确线程(即主线程)上调用一些 C++ 函数或方法。

我目前的方法是将函数指针传递给一个objective-c实例(派生自NSObject)并在其上执行performSelector/ performSelectorOnMainThread
但是performSelectors 期望对象作为他们的参数,那么通常如何包装呢?

例子:

 typedef void(*FnPtr)(void*);
 FnPtr fn;
 [someInstance performSelector:@selector(test:) withObject:fn];

...其中 test 被声明为:

- (void)test:(FnPtr)fn;

必须补充一点,我本周才开始使用objective-c,所以如果有更好的方法,我也很高兴听到它。
另请注意,我无权访问主循环或任何应用程序对象,因为该项目是一个浏览器插件(目前仅针对 Mac 上的 Safari)。

4

2 回答 2

5

正如 smorgan在这里回答的那样,NSValue被设计为标量 C 和 Objective-C 类型的容器:

- (void)test:(NSValue*)nv
{
    FnPtr fn = [nv pointerValue];
    // ...
}

// usage:
NSValue* nv = [NSValue valueWithPointer:fn];
[someInstance performSelector:@selector(test:) withObject:nv];
于 2009-11-12T00:41:33.240 回答
0

我不确定我的解决方案是否被认为是理智/正确的——但我确实经常通过简单地将指针类型转换为 (id) 来传递指针。这很脏,但对我有用。可能更清洁的方法是使用 NSValue。

于 2009-11-14T20:10:23.650 回答