如何安全地停止 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的主要内容,如果未能解决你的问题,请参考以下文章

如何安全地停止我的“类实现 Runnable”?

Docker 那些事儿如何安全地停止删除容器

如何使用 Multipeer Connectivity 安全地停止发送图像

Docker 那些事儿:如何安全地停止删除容器?

Docker 那些事儿如何安全地停止删除容器

在薄轨上安全地停止 em-websocket