我正在使用.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];
}
);
。但这开始看起来很恶心。
您可以通过以下方式在目标上执行选择器:
[targ performSelector:sel withObject:data];