Wie wirft man Blöcke in die Leere und aus der Leere *

Also versuche ich einen Block alsNSAlert contextInfo Parameter.

[myAlert beginSheetModalForWindow: theWindow
                    modalDelegate: myAlert
                   didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
                      contextInfo: (void *) aBlock];

und hol es dir am anderen Ende wieder:

void (^responseBlock)() = (__bridge_transfer void (^)()) contextInfo;

Was bis zu einem gewissen Grad funktioniert. Vor meinem Anruf zubeginSheetModalForWindow:... aBlock ist bei0x00007fff610e1ec0und in der Antwort (alertDidEnd:...), contextInfo ist bei0x00007fff610e1ec0.

Wenn ich jedoch versuche, den Block aufzurufen:

responseBlock();

Ich erhalte den folgenden Fehler

Fehler: Der aufgerufene Objekttyp '__block_literal_generic *' ist keine Funktion oder Funktionszeiger
Fehler: 1 Fehler beim Analysieren des Ausdrucks

Wie wirft man richtig Blöcke auf einen vonvoid *s für die einfache Übertragung?

Bearbeiten: Vollständiger versuchter Code unter Verwendung der in den Antworten vorgeschlagenen Besetzungsmethoden. Ich erhalte jetzt einen EXC_BAD_ACCESS Fehler auf demresponseBlock(); Anruf.

- (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;
        }
    }
}

Weitere Hinweise: Beim Benutzen__bridge, die Speicheradresse vonresponseBlock undcontextInfo sind anders, während mit__bridge_transfer, Sie sind gleich. Weder lindert das EXC_BAD_ACCESS-Problem.

ARBEITEN:
[myAlert beginSheetModalForWindow: theWindow
                    modalDelegate: myAlert
                   didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
                      contextInfo: (__bridge_retained void *) [aBlock copy]];

und später...

void (^responseBlock)() = (__bridge_transfer typeof(responseBlock)) contextInfo;

Antworten auf die Frage(1)

Ihre Antwort auf die Frage