如何安全地停止AVAudioPlayer

时间:2011-12-11 19:11:55

标签: iphone crash release avaudioplayer

我有一个带有两个按钮的AVAudioPlayer:播放和停止。 播放时隐藏播放按钮,反之亦然。

问题是当我在调用方法“audioPlayerDidFinishPlaying”时尝试在播放结束时按下“停止”按钮时发生崩溃。 实际上,这个方法释放了AVAudioPlayer,当我按下停止按钮(它也释放了对象......)时它会崩溃。 但是,我仍然测试玩家在手动释放之前是否为零,那为什么会崩溃以及如何避免这种情况?

我的代码: 在.h:

@private AVAudioPlayer* monPlayer; 
<。>中的

-(IBAction)playSound{
NSString *path = nil;
if(path = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"sounds/%d", idoiseau]  ofType:@"m4a"])
    {
    monPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    monPlayer.delegate = self;
    [monPlayer play];
    [buttonPlay setEnabled:NO];
    [buttonStop setEnabled:YES];
    }
else return; 
}

-(IBAction)stopSound{
if(!monPlayer) return;
[monPlayer stop];
[monPlayer release]; 
monPlayer = nil;
[buttonPlay setEnabled:YES];
[buttonStop setEnabled:NO];
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
[player release];
player = nil;
    [buttonPlay setEnabled:YES];
[buttonStop setEnabled:NO];
}

编辑:只需用委托方法中的实例变量“monPlayer”替换局部变量“player”,它就可以了。感谢hotpaw2: - )

1 个答案:

答案 0 :(得分:2)

您的代码似乎是将本地参数播放器设置为nil而不是对象实例变量monPlayer。