私はAVAudioPlayerに関連した奇妙なメモリリークの問題に悩まされています。AVAudioPlayerメモリリーク
問題の簡単な説明は次のとおりです。コードはすぐ後に表示されます。 私はプレイヤーを初期化し、無限ループでサウンドトラックを再生します(無限ループまたは一回の再生でも問題は変わりません)。 音楽が始まって数秒後に別のサウンドトラックに切り替えるので、新しいプレーヤーを作成して初期化し、再生中の古いものをリリースして、新しいものをリリースして再生します。
その時点(私は新しいプレーヤー - [Player play]を呼び出した直後)に、メモリリーク(3.5Kb)が発生します。
は、私が試した次が古いプレーヤーを停止していないし、それを解放 - プレーヤーは、右のプレイ命令の後には何の影響
リリース - 再生を開始しませんでしたが
古いプレーヤーを2回リリース - クラッシュ
作成して再生するとメモリリークは起こりません最初の選手!
また、参照して、それは「遊び」は非同期であるので、おそらくそれが1で参照カウントを増加させることを言うんが、この場合には、理由[プレーヤーを停止]助けにはなりませんでしたか?
おかげで、ここで
が、私はそれを使用する方法については、コードの一部です:
- (void) loadAndActivateAudioFunction {
NSBundle *mainBundle = [NSBundle mainBundle];
NSError *error;
NSURL *audioURL = [NSURL fileURLWithPath:[mainBundle pathForResource: Name ofType: Type]];
AVAudioPlayer *player = [(AVAudioPlayer*) [AVAudioPlayer alloc] initWithContentsOfURL:audioURL error:&error];
if (!player) {
DebugLog(@"Audio Load Error: no Player: %@", [error localizedDescription]);
DuringAudioPrep = false;
return;
}
[self lock];
[self setAudioPlayer: player];
[self ActivateAudioFunction];
[self unlock];
}
- (void) setAudioPlayer : (AVAudioPlayer *) player {
if (Player)
{
if ([Player isPlaying] || Repeat) // The indication was off???
[Player stop];
[Player release];
}
Player = player;
}
- (void) ActivateAudioFunction {
[Player setVolume: Volume];
[Player setNumberOfLoops: Repeat];
[Player play];
DuringAudioPrep = false;
}
ありがとうございました。 はい - InstrumentsでAVAudioPlayerであることを確認しました。 方法について - 私は実際に別のトラックを保存し、名前を一致させたり、同じトラックを何度もダウンロードする代わりに、再生していない場合に再利用したりするため、これを使用します。 「Alloc」を実行した後に呼び出し元からPlayerが取得されていることを知っているので、それが既に保持されていることが分かります(間違っていない限り)。 – Adi