我正在將C++庫橋接到iPhone應用程序。這工作正常。現在我爲從C++庫觸發的特定事件添加一個偵聽器(以lambda調用的形式),並且必須以某種方式冒泡到iPhone應用程序。將Objective-C塊傳遞給C++ lambda
我想過使用塊。當我實現監聽,它看起來是這樣的:
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指針並將其返回,但這沒有任何區別。