【发布时间】:2016-07-06 23:37:09
【问题描述】:
我正在开发 xcode8 swift 3.0 项目。它需要访问一个 C++ 库,该库需要一个回调函数将数据异步发送回 swift 调用者。 如果在 RegisterCallBack 函数中直接调用回调,则该回调确实有效。 但是,如果在 RegisterCallBack 函数之外调用它会崩溃。
在我的 swift 文件 ViewController.swift 中
override func viewDidLoad() {
super.viewDidLoad()
var closure: () -> Void = testfunc;
RegisterCallBack(closure)
run_swiftfunc()
}
func testfunc(){
print("test func in view contriller ");
}
....
// 在我的 wrapper.h 文件中
...
void run_swiftfunc();
void RegisterCallBack(void (^closure)());
...
// 在我的 wrapper.cpp 文件中
extern "C" {
typedef void (^callbackfunc)();
callbackfunc swiftFunc;
void RegisterCallBack(void (^closure)()){
swiftFunc = closure;
printf("function pointer 0x%x \n", (void*) swiftFunc);
swiftFunc(); //works well
}
void run_swiftfunc(){
printf("function pointer 0x%x \n", (void*) swiftFunc);
swiftFunc(); // fail, EXC_BAD_ACCESS
}
...
}
//日志打印: RegisterCallBack 函数指针 0x1300cd30
run_swiftfunc
函数指针0x1300cd30
在视图控制器中测试函数
run_swiftfunc
函数指针0x1300cd30
(lldb) ---->EXC_BAD_ACCESS(code =..
swiftfunc地址相同,都是0x1300cd30。如何保存 swiftfunc 块?
【问题讨论】: