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 bei0x00007fff610e1ec0
und 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.
[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;