Vì vậy, tôi đang cố chuyển một khối như một tham số NSAlert
contextInfo
.Làm thế nào để bỏ các khối vào và ra khỏi khoảng trống *
[myAlert beginSheetModalForWindow: theWindow
modalDelegate: myAlert
didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
contextInfo: (void *) aBlock];
và làm cho nó trở lại ở đầu bên kia:
void (^responseBlock)() = (__bridge_transfer void (^)()) contextInfo;
Những công trình, đến một mức độ nào đó. Trước khi tôi gọi tới số beginSheetModalForWindow:...
aBlock tại số 0x00007fff610e1ec0
và trả lời (alertDidEnd:...
), contextInfo là 0x00007fff610e1ec0
.
Tuy nhiên, khi tôi cố gắng gọi khối:
responseBlock();
tôi nhận được lỗi sau
error: called object type '__block_literal_generic *' is not a function or function pointer
error: 1 errors parsing expression
Làm sao người ta đúc đúng khối để một từ void *
s vì lợi ích của chuyển giao đơn giản ?
Chỉnh sửa: Mã đầy thử, sử dụng phương pháp truyền được đề xuất trong câu trả lời. Bây giờ tôi nhận được lỗi EXC_BAD_ACCESS trong cuộc gọi responseBlock();
.
- (void)alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{
void (^responseBlock)() = (__bridge typeof(responseBlock)) contextInfo;
switch (returnCode)
{
case NSCancelButton:
{
break;
}
case NSOKButton:
{
responseBlock();
break;
}
}
}
Ghi chú khác: Khi sử dụng __bridge
, địa chỉ bộ nhớ của responseBlock
và contextInfo
là khác nhau, trong khi với __bridge_transfer
, họ đều giống nhau. Không làm giảm bớt vấn đề EXC_BAD_ACCESS.
LÀM VIỆC:
[myAlert beginSheetModalForWindow: theWindow
modalDelegate: myAlert
didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
contextInfo: (__bridge_retained void *) [aBlock copy]];
và sau đó ...
void (^responseBlock)() = (__bridge_transfer typeof(responseBlock)) contextInfo;
Tôi có một câu trả lời, nhưng tôi không thể tái tạo vấn đề của bạn. Tôi tự hỏi tại sao đó là ... bạn có bất kỳ cảnh báo/biên dịch thêm nào không? –