为什么我的AVAudioPlayer没有播放?

时间:2014-06-11 23:51:03

标签: ios objective-c avfoundation

我相信有些事我没有从概念上得到。我创建了(我认为是)一个扩展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];
但是,没有任何事情发生。我做错了什么?

1 个答案:

答案 0 :(得分:1)

[AudioPlayer sharedAudioPlayer]返回一个静态变量,初始值为nil。因此,当您调用[[AudioPlayer sharedAudioPlayer] initWithString ...]时,您实际上正在调用[nil initWithString ...]。这什么都不做。执行此操作的常规方法是在单例访问器中初始化实例。

+(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构造函数。这暗示您的设计出了问题。如果对象采用参数,你确定你只想要一个参数吗?