数分前にもっと長い質問を投稿しましたが、通常は投稿するとすぐに何が起こっているのかを理解したので、ほとんどの投稿が無関係だったので削除しました。その後、Google に戻りました。
この投稿で説明されているのとほぼ同じ問題があり、6月から回答がありません。http://www.iphonedevsdk.com/forum/iphone-sdk-development/20975-avaudioplayer-nsurl-memory-management.html
要約すると、私は AVAudioPlayer を使用しており、それを audioPlayerDidFinishPlaying:successfully: デリゲート メソッドでリリースしています。プレーヤーを初期化した後、関連付けられている NSURL オブジェクトを解放する必要があります。そうしないと、リークが発生します。しかし、プレーヤーを初期化した後に解放すると、既に解放されているためクラッシュします。奇妙なことに、最初は常にクラッシュするとは限らず、ほとんどの場合、2 番目のサウンドが再生された後にクラッシュします。ときどき (めったに) クラッシュする前に、少数またはプレーヤーを割り当て/解放することができます (私は解放後にポインターを再利用します)。何か助けはありますか?
コード スニペット: (soundKeyUp は AVAudioPlayer* クラス変数であるため、ここでは宣言しません)
NSString *soundKeyUpPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"soundKeyUp%d", key.tag % 5] ofType:@"wav"];
NSURL *soundKeyUpURL = [[NSURL alloc] initFileURLWithPath:soundKeyUpPath];
soundKeyUp = [[AVAudioPlayer alloc] initWithContentsOfURL:soundKeyUpURL error:nil];
if(soundKeyUp) {
[soundKeyUp setDelegate:self];
[soundKeyUp play];
}
else {
[soundKeyUp release];
soundKeyUp = nil;
}
[soundKeyUpPath release];
[soundKeyUpURL release];
Steve Riggins への返信: 前述のように、毎回同時にクラッシュしないというのが秘訣です。ほとんどの場合、最初は適切にリリースされます (または、少なくともクラッシュやリークは発生しません) が、通常、2 回目にプレーヤーと URL を割り当て/解放した後、URL を解放するとクラッシュします。クラッシュするまでに 3 回、4 回、5 回以上かかることもありますが、常にクラッシュします。