我想将objective-c ++函数指针传递给标准c ++,以便我可以在C ++上调用objective-c方法。
这是我想要实现的目标:
//C++ side
class CppSide
{
public:
void(*TestFunction)();
};
//objective-c++ side
@interface InteropController : GLKViewController{
}
-(void) PickFile; //I want to pass PickFile address to TestFunction
@end
以下是我所做的,但不起作用
InteropController* controller = [[InteropController alloc] init];
CppSide* cppSide = new CppSide();
cppSide->TestFunction = [controller methodForSelector:@selector(PickFile:)];
cppSide->TestFunction(); //EXC_BADccess(code=1, address=0x2d)
我该怎么办?
答案 0 :(得分:3)
懒惰,简单的方法是传递调用objC代码的std ::函数(例如,使用lambda)。
但是,你有一个原始的C函数指针。您将需要编写C函数(或使用非捕获lambda):
cppSide->TestFunction = [](){ ... ObjC Code here ...};
但是,您无法在那里引用父作用域 - 仅限于全局作用域。
如果您可以改为使用std :: function,那么您将具有更大的灵活性:
cppSide->TestFunction = [=](){[controller PickFile: ... ];};
如果由于某种原因无法更改该函数指针类型,请考虑更改它,以便它至少需要一个数据指针:
class CppSide
{
public:
void(*TestFunction)(void *data);
};
然后你可以这样做:
cppSide->TestFunction = [](void *data) {
InteropController* controller = static_cast<InteropController*>(data);
[controller PickFile: ... ];
}
调用函数指针的调用者需要显式传递控制器。