多次按下倒带按钮时应用程序崩溃

时间:2012-06-26 15:39:02

标签: iphone

应用程序崩溃和消息是程序接收信号“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;
 }

我不知道为什么崩溃可能是因为恢复计时器或可能是因为我发布的视图控制器。

1 个答案:

答案 0 :(得分:1)

为什么要在倒带功能中分配和初始化MainViewController?这对我来说似乎很奇怪,通常你只需要初始化你的viewcontroller一次,而不是每次调用一个方法。同样,你在方法结束时释放它,这也很奇怪。通常,由于内存管理问题导致多次单击导致的错误。我猜测正在从内存中删除某些内容(可能是您的视图控制器)然后您正在尝试访问它,从而导致访问错误。

要调试此功能,请使用NSZombies,它允许您查看从内存中删除的内容。可以找到如何使用它的教程here