2012-04-06 43 views
5

我將下面顯示的代碼更改爲ARC兼容。如何正確使用__bridge ARC_

我只是將其更改爲Xcode的建議,並且它不會在Xcode上顯示錯誤。但是一旦事件發生,代碼就會崩潰。有人有想法解決這個問題嗎?

我不確定這個暗戀是否因爲acapela SDK而發生,或者不是。

這是非ARC代碼,它工作正常。

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

這是ARC兼容,但它壓碎上[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]; 
    } 
} 

附加信息。 我正在使用Acapela音頻SDK,音頻中斷代碼顯示在這PDF的中斷。 http://www.ecometrixem.com/cms-assets/documents/44729-919017.acapela-for-iphone.pdf

這是粉碎的截圖。 enter image description here

解決 此代碼的工作,謝謝。

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是CF對象和對象需要參考要保持他們。 __bridge用於不需要保留的NSObject。 – CodaFi 2012-04-06 23:41:48

+0

感謝您的解釋。 :) – 2012-04-07 01:02:41

回答

6

你需要的東西是這樣的:

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

它就像一個魅力,非常感謝你! – 2012-04-07 01:03:13