Quindi, sto provando a passare un blocco come parametro NSAlert
contextInfo
.Come eseguire il cast dei blocchi da e verso il vuoto *
[myAlert beginSheetModalForWindow: theWindow
modalDelegate: myAlert
didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
contextInfo: (void *) aBlock];
e farlo ritornare sull'altra estremità:
void (^responseBlock)() = (__bridge_transfer void (^)()) contextInfo;
Quali opere, in una certa misura. Prima della mia chiamata a beginSheetModalForWindow:...
aBlock è a 0x00007fff610e1ec0
e nella risposta (alertDidEnd:...
), contextInfo è a 0x00007fff610e1ec0
.
Tuttavia, quando provo a richiamare il blocco:
responseBlock();
ottengo il seguente errore
error: called object type '__block_literal_generic *' is not a function or function pointer
error: 1 errors parsing expression
Come si fa gettato correttamente blocchi a un da void *
s per il bene di semplice trasferimento ?
Edit: tentato codice completo, utilizzando i metodi del cast suggerite nelle risposte. Ora ricevo un errore EXC_BAD_ACCESS sulla chiamata 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;
}
}
}
Altre note: Quando si utilizza __bridge
, l'indirizzo di memoria di responseBlock
e contextInfo
sono diversi, mentre con __bridge_transfer
, sono la stessa cosa. Né allevia il problema EXC_BAD_ACCESS.
LAVORO:
[myAlert beginSheetModalForWindow: theWindow
modalDelegate: myAlert
didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
contextInfo: (__bridge_retained void *) [aBlock copy]];
e poi ...
void (^responseBlock)() = (__bridge_transfer typeof(responseBlock)) contextInfo;
ho una risposta, ma non riesco a riprodurre il problema. Mi chiedo perché sia ... hai altre bandiere di avviso/compilazione? –