ios - 为什么我的 AVAudioPlayer 不播放?

标签 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

所以我从我的游戏的主视图 Controller 访问这个类是这样的:

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

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

最佳答案

[AudioPlayer共享音频播放器]返回一个静态变量,初始值为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];

但是,请注意您正在将参数传递给单例构造函数。这暗示您的设计有问题。如果该对象带有一个参数,您确定只希望有一个参数吗?

关于ios - 为什么我的 AVAudioPlayer 不播放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24174413/

相关文章:

ios - 使用 mach 端口的 Theos 应用程序间通信

ios - 如何使用 AVFoundation(> 1 分钟)录制长视频?

ios - 通过 Carthage 导入和使用 Swift SnapshotTesting 框架

ios - iOS 中的库(.a 文件)或框架,哪个是更好的选择

objective-c - 使用 NSEvent 在 OS X 上捕获其他鼠标按钮事件

ios - 如何在 iOS 中动态改变视频的播放速率?

objective-c - Cocoa:从文件加载的 AVAsset 有 0 个轨道

ios - UITableView 及其在 xib 文件中的单元格

ios - iTunesConnection 中的促销文字和副标题是什么?

ios - 在 iOS 中从 Kinvey 下载文件