2012-06-26 6 views
0

iPhone 장치에서 응용 프로그램을 테스트하기 위해 응용 프로그램이 충돌하고 메시지가 프로그램 수신 신호 "EXC_BAD_ACCESS"를 여러 번 되풀이하여 되감기 버튼을 여러 번 누르는 경우.되감기 버튼을 여러 번 누르는 경우 응용 프로그램이 다운 됨

-(void)rewind:(id)sender{ 
[timer invalidate]; 
audioPlayer.currentTime = 0; 
MainViewController *viewController = [[MainViewController alloc] init]; 
viewController.view.frame = CGRectMake(0, 0, 320, 480); 
[self.view addSubview:viewController.view]; 
[self.view addSubview:toolbar]; 
[viewController release]; 
[self playpauseAction:_playButton]; 
} 

-(void)playpauseAction:(id)sender { 
if([audioPlayer isPlaying]) 
{ 
    [sender setImage:[UIImage imageNamed:@"Play Icon.png"] forState:UIControlStateSelected]; 
    [audioPlayer pause]; 
    [self pauseTimer]; 
    [self pauseLayer:self.view.layer]; 

}else{ 
    [sender setImage:[UIImage imageNamed:@"pause.png"] forState:UIControlStateNormal]; 
    [audioPlayer play]; 
    [self resumeTimer]; 
    [self resumeLayer:self.view.layer]; 

    if(isFirstTime == YES) 
    { 
     self.timer = [NSTimer scheduledTimerWithTimeInterval:11.0 
                 target:self 
                selector:@selector(displayviewsAction:) 
                userInfo:nil 
                repeats:NO]; 
     isFirstTime = NO; 
    } 
    } 
    } 

-(void)pauseTimer{ 
pauseStart = [[NSDate dateWithTimeIntervalSinceNow:0] retain]; 

previousFireDate = [[timer fireDate] retain]; 

[timer setFireDate:[NSDate distantFuture]]; 
    } 

-(void)resumeTimer{ 
float pauseTime = -1*[pauseStart timeIntervalSinceNow]; 

[timer setFireDate:[previousFireDate initWithTimeInterval:pauseTime sinceDate:previousFireDate]]; 
} 


-(void)resumeLayer:(CALayer*)layer 
{ 
CFTimeInterval pausedTime = [layer timeOffset]; 
layer.speed = 1.0; 
layer.timeOffset = 0.0; 
layer.beginTime = 0.0; 
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; 
layer.beginTime = timeSincePause; 
} 

-(void)pauseLayer:(CALayer*)layer 
{ 
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
layer.speed = 0.0; 
layer.timeOffset = pausedTime; 
} 

내가 이력서 타이머로 인해 충돌이 올 수 있으며 왜 내가 출시 한보기 컨트롤러 때문일 수 있는지 알지 못합니다.

+0

정확히 무엇을하고 싶은가 ?? – Abhishek

+0

pauseTimer 및 resumeTimer 메서드에 대한 코드를 게시 할 수 있습니까? 나는 당신이 [타이머 invalidate] 메시지를 볼 수 있지만 타이머를 작동시키는 방법도 사용한다. –

+0

방금 ​​내 게시물을 편집했다. – user1452248

답변

1

왜 되감기 함수 안에 MainViewController를 할당하고 초기화합니까? 그게 이상한 것, 일반적으로 경우에만 메서드를 호출 할 때마다 한 번 귀하의 viewcontroller 초기화해야합니다. 그리고 비슷하게, 메소드의 끝 부분에서 그것을 해제합니다. 이것은 또한 이상합니다. 일반적으로 여러 번의 클릭이 발생하는 오류는 메모리 관리 문제로 인해 발생합니다. 나는 뭔가가 메모리 (아마도 귀하의보기 컨트롤러)에서 제거되고 당신이 나쁜 액세스 오류를주는 그것에 액세스하려고하는 것 같아요.

이것을 디버깅하려면 NSZombies를 사용하면 메모리에서 제거 된 내용을 볼 수 있습니다. 그것을 사용하는 방법에 대한 자습서는 찾을 수 있습니다 here

+0

이유는 내가 되감기 또는 재생을 누르면 오디오 파일을 재생하기 때문에 mainviewcontroller가 되감기 기능을 시작한다는 것이다. 같은 시간에 여러 개의보기 컨트롤러가 하나씩 차례로로드되므로 되감기 버튼을 누르면 처음부터 시작된다는 것을 의미합니다. 그리고 시작 화면이나 메인 뷰 컨트롤러를 표시하는 것을 의미합니다.로드 컨트롤러 앞에 – user1452248

+0

이 표시됩니다. 나는 여전히 그것이 메모리 관리 오류라고 생각하고있다. EXC_BAD_ACCESS는 memorr에게 메시지를 보낼 때 발생하는 오류이지만 메모리에는 실행할 수있는 클래스가 없습니다. 즉, 아직 초기화되지 않았거나 이미 릴리스되었습니다. 당신의 코드를 볼 수있는 가장 좋은 추측은 당신이 나중에 필요할 때 viewController를 해제하는 것처럼 보인다는 것입니다. 그러나 EXC_BAD_ACCESS 오류는 코드를보고 디버그하기가 어려울 수 있으므로 디버거 도구로 NSZombies를 사용하는 것이 좋습니다. –

+0

iPhone 장치에서도 nszombie를 사용할 수 있는지 모르겠 음 – user1452248

관련 문제