2012-06-19 7 views
13

Quindi, sto provando a passare un blocco come parametro NSAlertcontextInfo.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; 
+0

ho una risposta, ma non riesco a riprodurre il problema. Mi chiedo perché sia ​​... hai altre bandiere di avviso/compilazione? –

risposta

6

Ecco un piccolo esempio. Credo che il problema con il codice è che si sta tentando di utilizzare __bridge_transfer con una void * che non è memoria gestita con ARC:

void takesBlock(void *asPointer) 
{ 
    void (^asBlock)() = (__bridge typeof asBlock) asPointer; 

    asBlock(); 
} 

int main() 
{ 
    @autoreleasepool { 
     takesBlock((__bridge void *)[^{ 
      NSLog(@"Hello World!"); 
     } copy]); 
    } 
} 
+0

'void (^ responseBlock)() = (__bridge typeof responseBlock) contextInfo;' mi dà l'errore di sintassi: 'Expected ')'' su 'responseBlock' in' typeof responseBlock'. Pensieri? –

+0

@pcperini puoi pubblicare il contenuto della funzione in un contenitore di pasta? –

+0

Aggiunta la funzione completa alla domanda. L'errore è cambiato da un errore di tipo a un EXC_BAD_ACCESS completo. –

Problemi correlati