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;
 }

再開タイマーが原因であるか、リリースしたView Controllerが原因である可能性があるため、クラッシュする理由がわかりません。

4

1 に答える 1

1

巻き戻し関数内で MainViewController を割り当てて初期化するのはなぜですか? 私には奇妙に思えますが、通常、メソッドが呼び出されるたびにビューコントローラーを初期化する必要はなく、一度だけ初期化する必要があります。同様に、メソッドの最後でそれを解放しますが、これも奇妙です。通常、複数回のクリックが必要なエラーは、メモリ管理の問題が原因です。何かがメモリ (おそらくビュー コントローラー) から削除され、アクセスしようとすると、不正なアクセス エラーが発生すると推測しています。

これをデバッグするには、メモリから何が削除されたかを確認できる NSZombies を使用します。使い方のチュートリアルはこちら

于 2012-06-26T15:46:40.950 に答える