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 blokada0x00007fff610e1ec0iw 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.

PRACUJĄCY:
[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;

questionAnswers(1)

yourAnswerToTheQuestion