Tôi đang thực hiện một số Interop từ Mono C# tới Obj-C và chạy vào vấn đề này. Mã C# cần chuyển qua một cuộc gọi lại - mà nó thực hiện với một con trỏ hàm. Tôi có thể lấy con trỏ hàm từ phía Obj-C và gọi nó và mọi thứ hoạt động. Nhưng bây giờ tôi cần phải cung cấp cho con trỏ hàm đó như một cuộc gọi lại tới API của bên thứ ba hoạt động với các khối như một cuộc gọi lại. Tôi muốn bên thứ ba gọi hàm C# - vì vậy tôi đang cố chuyển đổi con trỏ hàm thành một khối để bên thứ ba có thể chạy hoặc tạo một loại cầu nối - tạo khối của riêng tôi chạy con trỏ hàm đó và đưa nó cho bên thứ ba. Tôi dường như không thể tìm cách để làm điều đó - làm thế nào tôi sẽ tạo ra một khối với thông tin của chức năng để chạy và sau đó cung cấp cho nó cho bên thứ ba. Có thể có một lựa chọn khác cho tôi?"Chuyển đổi" một con trỏ hàm thành một khối trong mục tiêu-C
Chỉnh sửa: Đặt hàm trong biến toàn cầu có thể hoạt động nhưng tôi muốn có thể có vô số những thứ như API của bên thứ ba không đồng bộ và tôi không muốn nó gọi sai gọi lại.
Mã tôi đã cố gắng:
typedef void (*DummyAction)(char * result);
typedef void (^DummyBlock)(char * result);
@interface FunctionToBlock : NSObject
{
DummyAction function;
DummyBlock block;
}
- (id) initWithFunction: (DummyAction) func;
- (DummyBlock) block;
@end
@implementation FunctionToBlock : NSObject
- (id) initWithFunction: (DummyAction) func {
if (self = [super init]) {
function = func;
block = ^(char * result) {
function(result);
};
}
return self;
}
- (DummyBlock) block {
return block;
}
@end
Và sau đó tôi chạy này với
void RegisterCallback(char * text, DummyAction callback)
{
FunctionToBlock *funcToBlock = [[FunctionToBlock alloc] initWithFunction : callback];
funcToBlock.block(text);
}
Và nó không thành công với BAD_ACCESS. Có lẽ tôi đang làm một cái gì đó sai như tôi không phải là rất thành thạo với Obj-C được nêu ra. Tôi có thể xác nhận rằng cuộc gọi lại là ok nếu chạy trực tiếp và khối đó đang được gọi nhưng nó không thành công trên dòng hàm (kết quả).
Vâng, bạn đã đúng. Vì lý do nào đó mà tôi không nghĩ về điều đó. Công trình lớn và rất sạch sẽ. Cảm ơn bạn! – Amitloaf