通过performSelector传递指针或整数类型

时间:2009-11-10 11:04:52

标签: c++ objective-c macos objective-c++

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

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

示例:

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

...其中test被声明为:

- (void)test:(FnPtr)fn;

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

2 个答案:

答案 0 :(得分:5)

正如smorgan here所回答,NSValue被设计为标量C& C的容器。 Objective-C类型:

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

// usage:
NSValue* nv = [NSValue valueWithPointer:fn];
[someInstance performSelector:@selector(test:) withObject:nv];

答案 1 :(得分:0)

我不确定我的解决方案是否被认为是正确/正确的 - 但我经常通过简单地将它们转换为(id)s来传递指针。这很脏但对我有用。可能更干净的方法是使用NSValue。