2012-04-06 15 views
5

Zmieniłem poniższy kod na zgodny z ARC.Jak poprawnie używać __bridge dla ARC

Po prostu zmieniłem to tak, jak sugerował Xcode, i nie pokazuje błędu w Xcode. Ale kod miażdży, gdy wydarzenie się wydarzy. Czy ktoś ma pomysł, aby to naprawić?

Nie jestem pewien, czy to się zdarza z powodu pakietu SDK Acapela, czy nie.

To nie jest kod ARC, działa dobrze.

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

Jest to zgodne ARC, jednak miażdży w [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]; 
    } 
} 

Dodatkowe info. Używam Acapela audio SDK, kod przerwania dźwięku jest pokazany na 9. Interruptions tego pliku PDF. http://www.ecometrixem.com/cms-assets/documents/44729-919017.acapela-for-iphone.pdf

To jest zrzut ekranu dla sympatii. enter image description here

SOLVED ten kod działa, dzięki.

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 jest dla obiektów CF i obiektów, które wymagają odniesienie być na bieżąco z nimi. __bridge jest używany dla obiektów NSO, które nie wymagają zachowania. – CodaFi

+0

Dzięki za wyjaśnienie. :) –

Odpowiedz

6

Trzeba coś takiego:

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

Działa jak urok, dziękuję bardzo! –

Powiązane problemy