这是使用AVAudioPlayer的正确方法吗,我的代码看起来是否合适?

时间:2009-04-08 06:11:27

标签: iphone

考虑代码:

    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检测到内存泄漏。

我的代码是否一切正常?

3 个答案:

答案 0 :(得分:8)

您需要释放您创建的AVAudioPlayer实例。由于上面的代码将委托设置为self,因此只需实现以下方法并在那里释放:

    - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
    NSLog(@"Audio finished playing.");
    [player release];
}

答案 1 :(得分:0)

  1. 您为什么release -owning引用(soundFilePath)?
  2. 如果您要立即调用prepareToPlay,则无需手动play
  3. 引用play的文档:

      

    <强>讨论

         

    如果音频播放器尚未准备播放,则调用此方法会隐式调用prepareToPlay方法。

    就个人而言,我这样做:

    NSURL *soundUrl = [NSURL fileURLWithPath:
                       [[NSBundle mainBundle] pathForResource:track
                                                       ofType:nil]];
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl
                                                         error:nil];
    [audioPlayer setDelegate:self];
    [audioPlayer play];
    

    其中audioPlayerivartrack是类型为lvar的{​​{1}},我之前从配置下一首歌曲的地方获得了NSString*

答案 2 :(得分:0)

我一直在做类似的事情,但我使用的是一段略有不同的代码。不幸的是,我有内存泄漏,因此我决定尝试你发布的代码。同样的结果:当我调用[audioPlayer play];

时,内存再次泄漏

我无法弄清楚发生了什么。当涉及到AVAudioPlayer时,你们是否意识到任何内存泄漏?