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

Ara*_*and 16 c++ objective-c ios4 objective-c-blocks

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

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

nil*_*nil 13

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

你可能想为块类型设置一个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;
}
Run Code Online (Sandbox Code Playgroud)


ugh*_*fhw 8

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

void theFunction(blockReturnType (^argumentName)(blockArgumentTypes));
Run Code Online (Sandbox Code Playgroud)

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

int theFunction(int anArgument, int (^theBlock)(int)) {
    return theBlock(anArgument);
}
Run Code Online (Sandbox Code Playgroud)

此语法适用于C,C++和Objective-C.