1

編集: iOS 4.3.5 から iOS 5.1.1 に私のデバイス (および展開ターゲット) を更新しましたが、まだ同じ問題があります

サウンドを再生した後、クラス メンバーAVAudioPlayerを解放して別のサウンドを再生する際に問題が発生しました。

これは、 iOS 4.3.5/5.1.1を実行している第 3世代のiPod Touchという私のデバイスの 1 つだけに問題があるようです。

iOS 6を実行している私の第 4世代と第 5世代のデバイスは問題なく動作します。

[audio release];
audio = nil;
@try
{
    audio = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
    if ((audio != nil) && (!error))
    {
        audio.delegate = (id)self;
        audio.volume = gVolume/10;
        [audio play];
    }
    else
    {
        [audio release];
        audio = nil;
    }
}
@catch (NSException *exception)
{
    [audio release];
    audio = nil;
}

最初は問題なく再生されますが、このコードが別のサウンドを再生するために 2 回目に実行されると、EXC_BAD_ACCESSエラーが発生します。これは、4/5世代のデバイスでは発生しません。

再生時間を与えるために、別のサウンドを再生する必要があるまで、意図的にリリースを遅らせます。

AVAudioPlayerDelegateを使用してみましたが、問題は解決しませんでした。

[audio prepareToPlay];

viewDidLoadでオーディオnilに初期化し、 viewDidUnloaddeallocでクリーンアップします。

多くのメモリリークの問題がありましたが、このバージョンのコードはそれを解決したようです.

4

1 に答える 1

0

上記のコメントと他のすべてのアイデアの失敗のおかげで、私は先に進んでARCを利用しました。

プロジェクト全体をリファクタリングしてARCの使用を開始したくなかったので、すべてのオーディオニーズを処理する新しいクラスを書き直し、そのファイルに対してのみARCを有効にするためにいくつかのコンパイラフラグ( -fobjc-arc )を設定しました。

以前に何が間違っていたのか正確にはわかりませんが、システムは私よりもメモリの管理がはるかに優れているようで、すべての問題を解決できることを嬉しく思います。

編集2

どうやらAppleはついにメモリリークを修正したので、 iOS5iOS6の両方で正常に動作するARCソリューションに戻りました。

編集

私は少し時期尚早だったかもしれません。

このためにARCを実装することは一般的には役に立ちましたが、この特定の問題はさらに深くなります。

どうやら、iOS6のCoreFoundationにリークがあります。

ARCを使用したNSURLおよびAVAudioPlayerからのリーク

メモリリーク-NSStringとNSURL

ARCを使用すると、Gen 3 iOS 5デバイスでは正常に動作しますが、 Gen 4/5iOS6では大幅にリークします。

ARCがない場合、Gen 4/5 iOS 6は正常に動作しますが、Gen 3iOS5はクラッシュします。

最終的に、新しいクラスの2つのバージョンを作成しました。1つはARCを使用し、もう1つは使用しないで、実行時にシステムバージョン[[UIDevice currentDevice] systemVersion]をチェックして、使用するバージョンを決定しました。

少し不器用かもしれませんが、Gen3デバイスをサポートすることはできます。Appleが問題を修正した場合は、その時点で1つのバージョンに戻すことができます。

于 2013-01-30T19:59:00.783 に答える