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에게 감사드립니다 :-)
Ho ho ... 네 말이 맞아. 이제 로컬 변수를 인스턴스 변수로 바꾸면된다. 고맙습니다 ! – Chrysotribax