Я работаю над проектом xcode8 swift 3.0. Он должен получить доступ к библиотеке C++, для которой потребуется функция обратного вызова для асинхронной отправки данных обратно быстрому абоненту. Обратный вызов работает, если он вызван прямо внутри функции RegisterCallBack. Однако, если он выходит из строя, если вызывает его вне функции RegisterCallBack.вызов быстрой функции из C++ с EXC_BAD_ACCESS (...)
в моем быстром файле 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
}
...
}
// log print: Указатель функции RegisterCallBack 0x1300cd30
run_swiftfunc
указатель функции 0x1300cd30
тест FUNC в вид contriller
run_swiftfunc
указатель функции 0x1300cd30
(lldb) ----> EXC_BAD_ACCESS (код = ..
Адрес swiftfunc такой же, как и 0x1300 CD30. Как сохранить блок swiftfunc?
Возможные дубликатом [Взаимодействуя с классами C++ от Swift] (HTTP: // StackOverflow. com/questions/35229149/interactiveing-with-c-classes-from-swift) – CodeBender