1

我正在使用 .mm (ObjC++) 将 C++ 引擎嵌入到 ObjC iOS 项目中。

// 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。即使是,我也不确定 aSEL是否会通过 lambda 的捕获。它甚至是一个有效的 C++ 对象吗?

我可以通过以下方式中的静态方法蹦床来看到一种方法wrapper.mm

cppEngine.addCallback(
    [](int data) {
        [CppEngine myStaticMethod: data];
    }
);

...但这开始看起来很恶心。

4

1 回答 1

1

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

[targ performSelector:sel withObject:data];
于 2018-03-13T05:49:38.067 回答