5

以下に示すコードをARC互換に変更しました。

Xcodeが提案したように変更しましたが、Xcodeでエラーが表示されません。しかし、イベントが発生すると、コードはクラッシュします。誰かがこれを修正するアイデアを持っていますか?

このクラッシュがアカペラ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の9.Interruptionsに示されています。 http://www.ecometrixem.com/cms-assets/documents/44729-919017.acapela-for-iphone.pdf

これはクラッシュのスクリーンショットです。 ここに画像の説明を入力してください

解決済み このコードは機能します、ありがとう。

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

1 に答える 1

6

次のようなものが必要です。

id asObject = (__bridge id) (*(void **) ptr);
于 2012-04-06T23:48:34.003 に答える