2014-06-11 3 views
0

저는 개념적으로 이해하지 못하는 것이 있다고 생각합니다. AVAudioPlayer를 확장 한 싱글 톤 AudioPlayer 클래스를 만들었습니다. 내가 한 이유는 내 게임의 배경 음악이기 때문에 나중에 중지하고 시작할 수 있기를 원했기 때문입니다. 여기 내부의 모든 코드는 다음과 같습니다하지만,왜 내 AVAudioPlayer가 재생되지 않습니까?

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

아무런 변화가 없습니다 :

#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 

그래서 나는이 같은 내 게임의 기본보기 컨트롤러에서 클래스를 액세스. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

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]; 

, 당신이 당신의 단일 생성자에 매개 변수를 전달하는 통지를 호출 할 수 있어야합니다. 이는 설계에 문제가 있다는 암시입니다. 개체가 매개 변수를 사용하는 경우에는 하나만 있어야한다는 사실을 확인하십시오.

+0

감사합니다. @ wombat57! 그것은 그것을 설명합니다. 당신은 그것이 싱글 톤일 필요가 없을지도 모른다고 생각합니다. 나는 그것을 다시 생각할 것입니다. –

관련 문제