我使用.mm(ObjC ++)在一个ObjC iOS项目中嵌入了一个C ++引擎。
// consumer.m
Wrapper* wrapper = ...;
[wrapper setupWithTarget: self
selector: @selector(gotData:)];
-(void) gotData: (int) k {...}
//wrapper.mm
@interface Wrapper() { id targ; SEL sel; } @end
:
-(void) setupWithTarget: T
selector: S] {
targ = T;
sel = S;
cppEngine = new cppEngine(); // i.e. C++ code
cppEngine.addCallback(
[](int data) {
std::cout << "got" << data;
[targ sel: data];
}
);
}
即。我们设置cppEngine
给它一个回调;这里是一个C ++ lambda。
当引擎触发回调时,我们必须将数据传递回消费者。
我的问题是:做这个的正确架构是什么?我不认为[targ sel: data];
是有效的目标C.即使它是,我也不确定SEL
是否会通过lambda的捕获来实现它。它甚至是一个有效的C ++对象吗?
我可以通过蹦蹦式wrapper.mm
中的静态方法看到一种方法:
cppEngine.addCallback(
[](int data) {
[CppEngine myStaticMethod: data];
}
);
......但那开始看起来很蠢。
答案 0 :(得分:1)
您可以通过以下方式在目标上执行选择器:
[targ performSelector:sel withObject:data];