如何安全地停止 AVAudioPlayer
Posted
技术标签:
【中文标题】如何安全地停止 AVAudioPlayer【英文标题】:how to stop AVAudioPlayer securely 【发布时间】:2011-12-11 19:11:54 【问题描述】:我有一个带有两个按钮的 AVAudioPlayer:播放和停止。 播放时播放按钮隐藏,反之亦然。
问题是当我尝试按下停止按钮时发生崩溃,就在播放结束时,在调用方法“audioPlayerDidFinishPlaying”的那一刻。 事实上,这种方法释放了 AVAudioPlayer,当我按下停止按钮(也释放对象......)时,它崩溃了。 但是,我仍然在手动释放之前测试播放器是否为 nil,那么它为什么会崩溃以及如何避免这种情况?
我的代码: 在 .h 中:
@private AVAudioPlayer* monPlayer;
在 .m 中:
-(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];
edit:只需在委托方法中用实例变量“monPlayer”替换局部变量“player”,就可以了。感谢 hotpaw2 :-)
【问题讨论】:
【参考方案1】:您的代码似乎将本地参数 player 设置为 nil 而不是对象实例变量 monPlayer。
【讨论】:
嗬嗬...你是完全正确的:现在它可以通过用实例变量替换局部变量来工作。谢谢!以上是关于如何安全地停止 AVAudioPlayer的主要内容,如果未能解决你的问题,请参考以下文章