2011-12-11 2 views
0

나는 Play와 Stop이라는 두 개의 버튼이있는 AVAudioPlayer가 있습니다. 재생 단추는 재생할 때 숨겨져 있으며, 그 반대의 경우도 마찬가지입니다.AVAudioPlayer를 안전하게 중지하는 방법

문제는 "audioPlayerDidFinishPlaying"메서드가 호출 될 때 재생이 끝난 시점에서 중지 단추를 누르려고 할 때 충돌이 발생한다는 것입니다. 사실,이 메서드는 AVAudioPlayer를 해제하고 중지 버튼 (객체를 너무 많이 놓음)을 누르면 충돌이 발생합니다. 하지만 플레이어가 수동으로 릴리스하기 전에 무의미한 지 테스트합니다. 그렇다면 왜 충돌이 발생하고이를 피하는가?

-(IBAction)playSound{ 
NSString *path = nil; 
if(path = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"sounds/%d", idoiseau] ofType:@"m4a"]) 
    { 
    monPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 
    monPlayer.delegate = self; 
    [monPlayer play]; 
    [buttonPlay setEnabled:NO]; 
    [buttonStop setEnabled:YES]; 
    } 
else return; 
} 

-(IBAction)stopSound{ 
if(!monPlayer) return; 
[monPlayer stop]; 
[monPlayer release]; 
monPlayer = nil; 
[buttonPlay setEnabled:YES]; 
[buttonStop setEnabled:NO]; 
} 

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { 
[player release]; 
player = nil; 
    [buttonPlay setEnabled:YES]; 
[buttonStop setEnabled:NO]; 
} 

편집 : 그냥 인스턴스 변수 "monPlayer"에 의해 로컬 변수 "플레이어"를 대체하는 .m에서

@private AVAudioPlayer* monPlayer; 

다음 .H에서 :

내 코드

대리자 메서드를 사용하고 작동합니다. hotpaw2에게 감사드립니다 :-)

답변

2

코드가 객체 인스턴스 변수 monPlayer 대신에 local parameter player를 nil로 설정하는 것으로 보입니다.

+0

Ho ho ... 네 말이 맞아. 이제 로컬 변수를 인스턴스 변수로 바꾸면된다. 고맙습니다 ! – Chrysotribax

관련 문제