2012-04-06 42 views
5

Tôi đã thay đổi mã được hiển thị bên dưới thành tương thích ARC.Cách sử dụng __bridge cho ARC chính xác

Tôi vừa thay đổi nó như Xcode được đề xuất và nó không hiển thị lỗi trên Xcode. Nhưng đoạn mã đã nghiền nát một khi sự kiện xảy ra. Có ai có ý tưởng sửa lỗi này không?

Tôi không chắc liệu điều này có xảy ra do acapela SDK hay không.

Đây không phải là mã ARC, nó hoạt động tốt.

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

Đây là ARC tương thích, nhưng nó nghiền nát trên [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]; 
    } 
} 

Thông tin bổ sung. Tôi đang sử dụng SDK âm thanh Acapela, mã gián đoạn âm thanh được hiển thị trên 9.Interruptions của tệp PDF này. http://www.ecometrixem.com/cms-assets/documents/44729-919017.acapela-for-iphone.pdf

Đây là ảnh chụp màn hình cho sự cố. enter image description here

SOLVED Mã này hoạt động, cảm ơn.

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 là cho các đối tượng CF và các đối tượng đòi hỏi phải có một tham chiếu đến được giữ cho họ. __bridge được sử dụng cho NSObjects không yêu cầu lưu giữ. – CodaFi

+0

Cảm ơn bạn đã giải thích. :) –

Trả lời

6

Bạn cần một cái gì đó như thế này:

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

Nó hoạt động như một say mê, cảm ơn bạn rất nhiều! –

Các vấn đề liên quan