Jak rzucać bloki do iz pustki *
Próbuję przekazać blok jakoNSAlert
contextInfo
parametr.
[myAlert beginSheetModalForWindow: theWindow
modalDelegate: myAlert
didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
contextInfo: (void *) aBlock];
i odzyskaj go na drugim końcu:
void (^responseBlock)() = (__bridge_transfer void (^)()) contextInfo;
Który działa do pewnego stopnia. Przed moim wezwaniembeginSheetModalForWindow:...
jest blokada0x00007fff610e1ec0
iw odpowiedzi (alertDidEnd:...
), contextInfo jest na0x00007fff610e1ec0
.
Jednak gdy próbuję wywołać blok:
responseBlock();
Dostaję następujący błąd
błąd: nazwany typ obiektu „__block_literal_generic *” nie jest funkcją ani wskaźnikiem funkcji
błąd: 1 błędy podczas analizowania wyrażenia
Jak właściwie rzutować bloki na zvoid *
s ze względu na proste przeniesienie?
Edytować: Pełny kod próby, przy użyciu metod rzutowania zasugerowanych w odpowiedziach. Otrzymuję teraz błąd EXC_BAD_ACCESS naresponseBlock();
połączenie.
- (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;
}
}
}
Inne notatki: Podczas używania__bridge
, adres pamięciresponseBlock
icontextInfo
są różne, podczas gdy z__bridge_transfer
, oni są tacy sami. Ani nie łagodzi problemu EXC_BAD_ACCESS.
[myAlert beginSheetModalForWindow: theWindow
modalDelegate: myAlert
didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
contextInfo: (__bridge_retained void *) [aBlock copy]];
i później...
void (^responseBlock)() = (__bridge_transfer typeof(responseBlock)) contextInfo;