考虑代码:
soundFilePath = [[NSBundle mainBundle] pathForResource: @"Sound" ofType: @"wav"];
fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
avPlayerNextLevel = [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL error: nil];
avPlayerNextLevel1.volume = volume ;
[soundFilePath release];
[fileURL release];
然后播放声音
if([avPlayerNextLevel prepareToPlay]){
[avPlayerNextLevel play];
}
我在游戏中多次这样做。有时在模拟器上,声音停止播放。有时我会用AvAudioPlayer检测到内存泄漏。
我的代码是否一切正常?
答案 0 :(得分:8)
您需要释放您创建的AVAudioPlayer实例。由于上面的代码将委托设置为self,因此只需实现以下方法并在那里释放:
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
NSLog(@"Audio finished playing.");
[player release];
}
答案 1 :(得分:0)
release
非 -owning引用(soundFilePath
)?prepareToPlay
,则无需手动play
。引用play
的文档:
<强>讨论强>
如果音频播放器尚未准备播放,则调用此方法会隐式调用prepareToPlay方法。
就个人而言,我这样做:
NSURL *soundUrl = [NSURL fileURLWithPath:
[[NSBundle mainBundle] pathForResource:track
ofType:nil]];
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl
error:nil];
[audioPlayer setDelegate:self];
[audioPlayer play];
其中audioPlayer
是ivar
而track
是类型为lvar
的{{1}},我之前从配置下一首歌曲的地方获得了NSString*
。
答案 2 :(得分:0)
我一直在做类似的事情,但我使用的是一段略有不同的代码。不幸的是,我有内存泄漏,因此我决定尝试你发布的代码。同样的结果:当我调用[audioPlayer play];
时,内存再次泄漏我无法弄清楚发生了什么。当涉及到AVAudioPlayer时,你们是否意识到任何内存泄漏?