gpt4 book ai didi

ios - AVAudio 播放器单例在 isPlaying 检查时崩溃

转载 作者:行者123 更新时间:2023-11-29 11:11:16 27 4
gpt4 key购买 nike

我正在为 AVAudioPlayer 使用单例,效果很好。

我希望在初始化播放器之前添加一个检查,如果播放器已经在播放,则停止播放器。

我添加了这段代码:

SoundPlayer *player = [SoundPlayer sharedInstance];
if([player isPlaying]){
[player stop];
}

但它在 if([player isPlaying]) 行上给了我一个 EXE_BAD_ACCESS。

2 个问题:

  1. 如果这是一个单例,而我返回的是同一个播放器,那么它为什么不自行停止?
  2. 为什么我会收到错误消息?

完整代码

    #import "SoundPlayer.h"

@implementation SoundPlayer
@synthesize helpMode;

static SoundPlayer *sharedInstance = nil;

+ (SoundPlayer *)sharedInstance {
if (sharedInstance == nil) {
sharedInstance = [[super allocWithZone:NULL] init];
}

return sharedInstance;
}


+(BOOL)playSound:(NSURL*)url{

NSError *error;
SoundPlayer *player = [SoundPlayer sharedInstance];
if([player isPlaying]){
[player stop];
}

player = [[SoundPlayer sharedInstance] initWithContentsOfURL:url error:&error];
[player play];

if (player == nil){
NSLog(@"error %@ \n for file %@",[error description],[url path]);
return NO;
}else {
if (![player helpMode]) {
[player play];
}else{
NSLog(@"help mode");
}

}
return YES;
}

-(void)stopSound{
if ([self isPlaying]) {
[self stop];
}
}


@end

最佳答案

我不确定这是否是导致错误的原因,但我想我会在此处发布我对讨论的回复以使我的观点更清楚,因为我会有更多的空间和代码格式。

不,您不必重写所有方法,我只是想确保我理解正确。我要说的另一点是,就像在 stopSound{} 中一样,您应该使用 self 而不是

SoundPlayer *player = [SoundPlayer sharedInstance];

所以将您的代码更改为这个,运行它并查看它是否已修复,在下面发表评论让我知道结果。

 -(BOOL)playSound:(NSURL*)url{

NSError *error;
// SoundPlayer *player = [SoundPlayer sharedInstance];
if([self isPlaying]){
[self stop];
}

//not sure if this should be self or super (i think super, try both)
//if you overrided the init then definitely self

//[self initWithContentsOfURL:url error:&error];
[super initWithContentsOfURL:url error:&error];


[self play];

if (self == nil){
NSLog(@"error %@ \n for file %@",[error description],[url path]);
return NO;
}else {
if (![self helpMode]) {
[self play];
}else{
NSLog(@"help mode");
}

}
return YES;
}

实际上,您所做的只是创建一个指向自身的指针,并创建一个玩家对象,因为它是一个单例。话虽如此,我不确定为什么这会使它崩溃,而不是你“应该”使用 self 的事实。


+ (SoundPlayer *)sharedInstance {
if (sharedInstance == nil) {
sharedInstance = [[super allocWithZone:NULL] init];
}

return sharedInstance;
}

参见 here AVAudioPlayer 只有 2 个 init 方法而且都不是 init 因此你没有完全初始化你的父类(super class)。您需要覆盖 initWithContentsOfURL:url 方法并使用 url 参数初始化此对象及其 super。只需确保将 initWithContentsOfURL:url 放在 .h 和 .m 中即可。如果它很重要,也 idk 但只尝试 alloc 而不是 allocWithZone

关于ios - AVAudio 播放器单例在 isPlaying 检查时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11493031/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com