Итак, я пытаюсь передать блок как параметр NSAlert contextInfo.
[myAlert beginSheetModalForWindow: theWindow
modalDelegate: myAlert
didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
contextInfo: (void *) aBlock];
и верните его на другой конец:
void (^responseBlock)() = (__bridge_transfer void (^)()) contextInfo;
Что работает, в какой-то степени. До моего вызова beginSheetModalForWindow:... aBlock находится в 0x00007fff610e1ec0, а в ответе (alertDidEnd:...) contextInfo находится в 0x00007fff610e1ec0.
Однако, когда я пытаюсь вызвать блок:
responseBlock();
Я получаю следующую ошибку
error: называемый тип объекта '__block_literal_generic *' не является указателем функции или функции
Ошибка: 1 ошибка разбора выражения
Как правильно отбрасывать блоки с void * для простого переноса?
Edit:
Полностью выполненный код, используя методы литья, предложенные в ответах. Теперь я получаю ошибку EXC_BAD_ACCESS при вызове 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;
}
}
}
Другие примечания:
При использовании __bridge адрес памяти responseBlock и contextInfo различен, тогда как при __bridge_transfer они совпадают. Не уменьшает проблему с EXC_BAD_ACCESS.
РАБОЧИЕ:
[myAlert beginSheetModalForWindow: theWindow
modalDelegate: myAlert
didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
contextInfo: (__bridge_retained void *) [aBlock copy]];
и позже...
void (^responseBlock)() = (__bridge_transfer typeof(responseBlock)) contextInfo;