将块从目标 C 传递给C++方法

Pass a block to a C++ method from objective C

本文关键字:C++ 方法 目标      更新时间:2023-10-16

我有一个C++的辅助类,我用在objective-C上。我想从视图控制器(回调)向 c++ 类传递一个块,以便在执行它时我在主线程上并且可以更新 UI。我目前有一个类似的系统,使用函数指针并在调用函数时performSelector。我想要一个如何设置 c++ 变量以及如何将 objective-C 块传递给它并从 c++ 类调用它的示例。

如果这是不可能的,你能想到另一个/更好的解决方案吗?

那么,只是您不完全熟悉块语法吗? 如果是这样,这里有一个简单的示例,如果你已经熟悉函数指针,那么这个例子应该是有意义的(语法或多或少是相同的,但使用^来声明一个[创建闭包当然是不同的])。

您可能希望为块类型设置一个 typedef,只是为了避免自己一遍又一遍地重复同样的事情,但我提供了使用 typedef 和将块类型本身放在参数中的示例。

#import <Cocoa/Cocoa.h>
// do a typedef for the block
typedef void (^ABlock)(int x, int y);
class Receiver
{
public:
    // block in parameters using typedef
    void doSomething(ABlock block) {
        block(5, 10);
    }
    // block in parameters not using typedef
    void doSomethingToo(void (^block)(int x, int y)) {
        block(5, 10);
    }
};

int main (int argc, char const *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    Receiver rcv;
    // pass a block
    rcv.doSomething(^(int x, int y) { NSLog(@"%d %d", x, y); });
    rcv.doSomethingToo(^(int x, int y) { NSLog(@"%d %d", x, y); });
    [pool drain];
    return 0;
}

请参阅使用块作为函数参数。声明方法时,请使用类似于以下内容的语法来声明块参数:

void theFunction(blockReturnType (^argumentName)(blockArgumentTypes));

块调用看起来像函数调用,因此上面 theFunction 的实现只是调用块并返回其结果,如下所示:

int theFunction(int anArgument, int (^theBlock)(int)) {
    return theBlock(anArgument);
}

此语法适用于 C、C++ 和 Objective-C。