我正在将 C++ 库桥接到 iPhone 应用程序。这工作正常。现在,我正在为从 C++ 库(以 lambda 调用的形式)触发的某个事件添加一个侦听器,并且必须以某种方式冒泡到 iPhone 应用程序。
我考虑过使用积木。当我实现监听器时,它看起来像这样:
typedef void (^LISTENER)( NSString* param1, NSString* param2) ;
-(void) setListener:(LISTENER) listener
{
cppDelegate->setListener([&listener](string p1, string p2)
{
@autoreleasepool {
NSString *param1 = [NSString stringWithUTF8String:p1.c_str()];
NSString *param2 = [NSString stringWithUTF8String:p2.c_str()];
listener(param1, param2); //This fails
}
}
);
}
这就是我设置监听器的方式:
listener = ^(NSString* param1, NSString* param2) //this is a MyObj member variable
{
@autoreleasepool {
NSLog(@"%@, %@", param1, param2);
}
};
[myObj setLogFunction:listener];
我看到的问题是对块侦听器的调用因listener(param1, param2);
EXC_BAD_ACCESS 而失败。当我进入这一行时使用调试器,它会转到一些机器代码并失败。
我不确定发生了什么事。就好像监听器没有初始化一样。我能想到的只是块侦听器不能传递给 C++ lambda,但我不知道如何解决这个问题。我改为传递一个 void 指针并将其转换回来,但这没有任何区别。