2012-04-06 8 views
5

Cambié el código que se muestra a continuación en ARC compatible.Cómo usar __bridge para ARC correctamente

Acabo de cambiarlo como Xcode sugirió, y no muestra el error en Xcode. Pero el código se aplasta una vez que ocurre el evento. ¿Alguien tiene una idea para arreglar esto?

No estoy seguro de si este enamoramiento ocurre debido a acapela SDK, o no.

Esto no es código ARC, funciona bien.

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

Esto es compatible con ARC, pero aplasta en [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]; 
    } 
} 

información adicional. Estoy usando el SDK de audio Acapela, el código de interrupción de audio se muestra en las 9.Interrupciones de este PDF. http://www.ecometrixem.com/cms-assets/documents/44729-919017.acapela-for-iphone.pdf

Esta es la captura de pantalla para el enamoramiento. enter image description here

RESUELTO Este código funciona, gracias.

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 es para objetos CF y objetos que requieren una referencia a mantenerse a ellos. __bridge se usa para NSObjects que no requieren retención. – CodaFi

+0

Gracias por su explicación. :) –

Respuesta

6

se necesita algo como esto:

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

Funciona como un amuleto, ¡muchas gracias! –

Cuestiones relacionadas