2012-04-06 20 views
5

Ho modificato il codice mostrato di seguito in ARC compatibile.Come utilizzare correttamente __bridge per ARC

L'ho appena modificato come suggerito da Xcode e non mostra errori su Xcode. Ma il codice si schiaccia quando si verifica l'evento. Qualcuno ha un'idea per risolvere questo problema?

Non sono sicuro se questa cotta si verifica a causa dell'acapela SDK o no.

Questo non è codice ARC, funziona correttamente.

void MyInterruptionListener(void *inClientData, UInt32 inInterruptionState) { 

    AcapelaSpeech* anAcapelaSpeech = *(AcapelaSpeech**)inClientData; 

    if (inInterruptionState == kAudioSessionBeginInterruption) { 

     [anAcapelaSpeech setActive:NO]; 
     status = AudioSessionSetActive(NO); 
    } 
    if (inInterruptionState == kAudioSessionEndInterruption) { 

     status = AudioSessionSetActive(YES); 
     [anAcapelaSpeech setActive:YES]; 
    } 
} 

Questo è ARC compatibile, ma schiaccia su [anAcapelaSpeech setactive: NO] ;.

void MyInterruptionListener(void *inClientData, UInt32 inInterruptionState) { 

    AcapelaSpeech* anAcapelaSpeech = (__bridge_transfer AcapelaSpeech*)inClientData; 

    if (inInterruptionState == kAudioSessionBeginInterruption) { 

     [anAcapelaSpeech setActive:NO]; 
     AudioSessionSetActive(NO); 
    } 
    if (inInterruptionState == kAudioSessionEndInterruption) { 

     AudioSessionSetActive(YES); 
     [anAcapelaSpeech setActive:YES]; 
    } 
} 

Ulteriori informazioni. Sto usando Acapela audio SDK, il codice di interruzione audio è mostrato sul 9.Interruzioni di questo PDF. http://www.ecometrixem.com/cms-assets/documents/44729-919017.acapela-for-iphone.pdf

Questo è lo screenshot per la cotta. enter image description here

risolto Questo codice funziona, grazie.

void MyInterruptionListener(void *inClientData, UInt32 inInterruptionState) { 

    AcapelaSpeech *anAcapelaSpeech = (__bridge id) (*(void **) inClientData); 

    if (inInterruptionState == kAudioSessionBeginInterruption) { 

     [anAcapelaSpeech setActive:NO]; 
     AudioSessionSetActive(NO); 
    } 
    if (inInterruptionState == kAudioSessionEndInterruption) { 

     AudioSessionSetActive(YES); 
     [anAcapelaSpeech setActive:YES]; 
    } 
} 
+2

__bridge_retained è per gli oggetti CF e oggetti che richiedono un riferimento deve essere contenuto al loro. __bridge viene utilizzato per NSObjects che non richiedono la conservazione. – CodaFi

+0

Grazie per la tua spiegazione. :) –

risposta

6

avete bisogno di qualcosa di simile:

id asObject = (__bridge id) (*(void **) ptr); 
+0

Funziona come un incantesimo, grazie mille! –

Problemi correlati