2012-06-26 132 views
0

應用程序崩潰和消息是程序接收到的信號「EXC_BAD_ACCESS」,當在倒帶按鈕上多次按某個按鈕以測試iPhone設備上的應用程序時。當按下多次倒帶按鈕時,應用程序崩潰

-(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方法的代碼嗎?我看到你有一個[定時器無效]的消息,但你也使用方法來操作定時器 –

+0

我剛剛編輯我的帖子,請檢查 – user1452248

回答

1

爲什麼你要在你的倒帶功能中分配和初始化你的MainViewController?這對我來說似乎很奇怪,通常你只需要初始化你的viewcontroller一次,而不是每次調用一個方法。同樣,你在方法結束時釋放它,這也很奇怪。通常會導致多次點擊的錯誤是由內存管理問題引起的。我猜想有些東西正在從內存中刪除(可能是你的視圖控制器),然後你試圖訪問它,給你一個錯誤的訪問錯誤。

要調試這個,使用NSZombies,它允許你看到什麼是從內存中刪除。如何使用它的教程可以發現here

+0

的原因我啓動mainviewcontroller裏面倒帶功能,因爲當倒帶或播放時按它播放音頻文件和同一時間加載多個視圖控制器一個接一個,所以當後退按鈕被按下時,意味着從頭開始,這也意味着顯示啓動圖像或主視圖控制器無論你說loadviewcontrollers – user1452248

+0

之前我看到。我仍然認爲這是一個內存管理錯誤。 EXC_BAD_ACCESS是一個錯誤,當消息被髮送到溢出時會產生錯誤,但是內存中沒有類來執行它。這意味着它尚未初始化,或已經發布。我從你的代碼中可以看到的最好的猜測是你看起來會釋放viewController,當你以後還需要時。然而,EXC_BAD_ACCESS錯誤很難通過查看代碼來調試,所以我確實建議使用NSZombies作爲調試工具。 –

+0

我不知道是否也可以啓用iPhone設備的nszombie – user1452248

相關問題