Como lançar blocos de e para void *
Então, eu estou tentando passar um bloco como umNSAlert
contextInfo
parâmetro.
[myAlert beginSheetModalForWindow: theWindow
modalDelegate: myAlert
didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
contextInfo: (void *) aBlock];
e pegue de volta na outra ponta:
void (^responseBlock)() = (__bridge_transfer void (^)()) contextInfo;
O que funciona, até certo ponto. Antes da minha chamada parabeginSheetModalForWindow:...
aBlock está em0x00007fff610e1ec0
e na resposta (alertDidEnd:...
), contextInfo está em0x00007fff610e1ec0
.
No entanto, quando tento chamar o bloco:
responseBlock();
Estou tendo o erro a seguir
erro: o tipo de objeto chamado '__block_literal_generic *' não é um ponteiro de função ou função
erro: 1 erros de análise de expressão
Como alguém elenco corretamente blocos para um devoid *
s por uma questão de transferência simples?
Editar: Tentativa completa de código, usando os métodos de conversão sugeridos nas respostas. Agora recebo um erro EXC_BAD_ACCESS noresponseBlock();
ligar.
- (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;
}
}
}
Outras notas: Ao usar__bridge
, o endereço de memória deresponseBlock
econtextInfo
são diferentes, enquanto que com__bridge_transfer
, eles são os mesmos. Nem alivia o problema EXC_BAD_ACCESS.
[myAlert beginSheetModalForWindow: theWindow
modalDelegate: myAlert
didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
contextInfo: (__bridge_retained void *) [aBlock copy]];
e depois...
void (^responseBlock)() = (__bridge_transfer typeof(responseBlock)) contextInfo;