将块从目标 C 传递给C++方法
Pass a block to a C++ method from objective C
我有一个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。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法