转发从C ++到ObjC的回调

时间:2018-03-13 01:24:51

标签: c++ objective-c callback objective-c++ trampolines

我使用.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];
    }
);

......但那开始看起来很蠢。

1 个答案:

答案 0 :(得分:1)

您可以通过以下方式在目标上执行选择器:

[targ performSelector:sel withObject:data];