Ios 为什么我的AVAudioPlayer不能播放?

Ios 为什么我的AVAudioPlayer不能播放?,ios,objective-c,avfoundation,Ios,Objective C,Avfoundation,我相信有些东西是我在概念上没有得到的。我创建了(我认为是)一个扩展AVAudioPlayer的单例AudioPlayer类。我这样做的原因是,因为这是我游戏的背景音乐,我希望能够停下来以后再开始。下面是其中的所有代码: #import "AudioPlayer.h" //THIS IS A SINGLETON CLASS @implementation AudioPlayer static AudioPlayer *audioPlayer; +(AudioPlayer *) sharedAu

我相信有些东西是我在概念上没有得到的。我创建了(我认为是)一个扩展AVAudioPlayer的单例AudioPlayer类。我这样做的原因是,因为这是我游戏的背景音乐,我希望能够停下来以后再开始。下面是其中的所有代码:

#import "AudioPlayer.h"
//THIS IS A SINGLETON CLASS

@implementation AudioPlayer
static AudioPlayer *audioPlayer;

+(AudioPlayer *) sharedAudioPlayer {
    return audioPlayer;
}

-(id) initWithString:(NSString *)str {
    if (!audioPlayer) {
        NSURL *soundFileURL = [NSURL fileURLWithPath:str];
        audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
        audioPlayer.numberOfLoops = -1;
    }
    return audioPlayer;
}

@end
因此,我从游戏的主视图控制器访问该类,如下所示:

[[AudioPlayer sharedAudioPlayer] initWithString:[NSString stringWithFormat:@"%@/Music.mp3",[[NSBundle mainBundle] resourcePath]]];
[[AudioPlayer sharedAudioPlayer] play];

不过什么也没发生。我做错了什么?

[AudioPlayer sharedAudioPlayer]返回一个静态变量,初始值为零。因此,当您调用[[AudioPlayer sharedAudioPlayer]initWithString…]时,实际上是在调用[nil initWithString…]。这没用。通常的方法是在singleton访问器中初始化实例

+(AudioPlayer *) sharedAudioPlayer {
    return audioPlayer;
}
应该是

+(AudioPlayer *) sharedAudioPlayer {
    static AudioPlayer *sharedPlayer = nil;
    static dispatch_once_t onceToken = 0;
    dispatch_once(&onceToken, ^{
        sharedPlayer = [[[self class] alloc] initWithString:...];
    });
    return sharedPlayer;
} 
那你就可以打电话了

   [[AudioPlayer sharedAudioPlayer] play];

但是,请注意,您正在向singleton构造函数传递一个参数。这暗示您的设计有问题。如果对象接受一个参数,您确定只希望有一个参数吗

谢谢@wombat57!这就解释了。你说得对,也许不需要单身,我会重新考虑的。