gpt4 book ai didi

c++ - 使用 EXC_BAD_ACCESS(...) 从 C++ 调用 swift func

转载 作者:可可西里 更新时间:2023-11-01 02:16:18 25 4
gpt4 key购买 nike

我正在从事 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

在 View Controller 中测试功能

run_swiftfunc

函数指针0x1300cd30

(lldb) ---->EXC_BAD_ACCESS(代码=..

swiftfunc 地址相同,都是 0x1300cd30。如何保留 swiftfunc block ?

最佳答案

我发现这个 block 只是堆栈,所以只在函数的范围内有效。我最终使用 Block_copy 来避免这个问题。现在我可以使用异步回调函数调用c++中的swift函数了

//在我的 wrapper.cpp 文件中

 #include <Block.h>
extern "C" {
typedef void (^callbackfunc)();
callbackfunc swiftFunc;
void RegisterCallBack(void (^closure)()){
swiftFunc = Block_copy(closure);
printf("function pointer 0x%x \n", (void*) swiftFunc);
swiftFunc(); //works well
}

void run_swiftfunc(){
printf("function pointer 0x%x \n", (void*) swiftFunc);
swiftFunc();
}
...
}

关于c++ - 使用 EXC_BAD_ACCESS(...) 从 C++ 调用 swift func,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38235498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com