2010-12-31 4 views
0

위젯 메서드는 다음과 같습니다. 첫 번째 노래가 연주 된 후이 방법으로 들어가고 두 번째 노래가 재생되지만 두 번째 노래가 끝나면 끝납니다. 그것은 대리자 method.i에 모든 노래를 지속적으로 재생할 필요가 들어 가지 않습니다. 나는 확실하지 않다, 왜. 누군가 나를 도울 수 있습니까? 로컬 변수가 player라고 정의하지 않는 때문에ava 오디오 플레이어에서 다음 노래를 재생할 때 문제가 발생했습니다.

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)p successfully:(BOOL)flag 
{ 
if (flag == NO) 
    NSLog(@"Playback finished unsuccessfully"); 
else 
{ 
    //[player stop]; 
    index++; 
    NSLog(@"%d",index); 
    path=[[NSBundle mainBundle] pathForResource:[songlist objectAtIndex:index] ofType:@"mp3"]; 
    [player initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 
    [songlabel2 setTitle:[songlist objectAtIndex:index]]; 

    [endtime setText:[NSString stringWithFormat:@"%.2f",[player duration]/100]]; 
    [player play]; 
     } 
} 

답변

1

, 나는 player 첫 번째 노래를 재생하는 데 사용 된 인스턴스 변수라고 가정하고있어, 당신은

player = [[AVAudioPlayer alloc] initWithContentsOfURL:firstSongURL error:&error]; 
와 함께 만든

또는 비슷한 것으로, 위임자를 설정했습니다. 당신의 audioPlayerDidFinishPlaying: successfully: 방법, 당신은 당신이 동일한 인스턴스에 다시 -initWithContentsOfURL:error:을 보내는 의미

[player initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 

있습니다. 주어진 객체에서 이니셜 라이저를 두 번 호출하지 마십시오. 결과는 예측할 수 없으며 메모리 누수의 가능성이 있습니다. AVAudioPlayer의 이전 인스턴스를 해제해야합니다 (예 :

[player release]; 

다음 적절한 위임 첫 번째 노래했던 것처럼, 다시 +alloc-initWithContentsOfURL:error:로 새로운 인스턴스를 생성하고 설정합니다

player = [[AVAudioPlayer alloc] initWithContentsOfURL:secondSongURL error:&error]; 
player.delegate = self; 
[player play]; 
+0

덕분에 버디 .. 난이 내일 노력할 것입니다 및 그 결과를 알려주십시오. – Rajashekar

+0

안녕하세요. Bavarious, 효과가있었습니다. 방금 대리인을 맡았는데 내가 그 석방을하지 않았어. 정말 고맙습니다. 하지만 다른 문제가 있습니다. 일단 집 버튼을 누르면 앱이 사라지고 앱 아이콘을 클릭하면 동시에 2 곡이 재생됩니다. 왜 이런 일이 일어나고 있는지 확실하지 않습니다. – Rajashekar

+0

인스턴스를 해제하지 않고 인스턴스를 만들면 메모리 누수와 예기치 않은 부작용이 발생할 수 있습니다. 제발 해줘. –

관련 문제