Как бросать блоки в и из пустоты *
Итак, я пытаюсь передать блок какNSAlert
contextInfo
параметр.
[myAlert beginSheetModalForWindow: theWindow
modalDelegate: myAlert
didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
contextInfo: (void *) aBlock];
и вернуть его на другом конце:
void (^responseBlock)() = (__bridge_transfer void (^)()) contextInfo;
Который работает, в некоторой степени. До моего звонкаbeginSheetModalForWindow:...
АБлок в0x00007fff610e1ec0
и в ответ (alertDidEnd:...
), contextInfo находится в0x00007fff610e1ec0
.
Тем не менее, когда я пытаюсь вызвать блок:
responseBlock();
Я получаю следующую ошибку
error: called object type '__block_literal_generic *' is not a function or function pointer
error: 1 errors parsing expression
Как правильно бросить блоки в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;
}
}
}
Other Notes:
Когда используешь__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;