0

我正在使用故事板、ARC 和导航控制器在 Xcode 4.4 上为 iOS 5.1 开发一个简单的游戏。该应用程序可以在模拟器上完美运行,但不能在设备(iPhone 4 CDMA)上运行。所以基本上,我有一个带有 3 个 UI 按钮(玩游戏、选项、帮助)的主菜单。当我单击 Play Game 然后尝试通过导航控制器返回按钮返回菜单时,应用程序在设备上崩溃。它在以下线程停止:

Thread 1: EXC_BAD_ACCESS (code=1, address=0x70000008)

并指出以下几点:

0x35b4df78:  ldr    r3, [r4, #8] 

在我的代码中还有一点我正在调用 popToRootViewContoller 方法。它也在这里崩溃(与我想的相同的线程错误)。但是,如果我注释掉 viewWillDisappear 方法,那么我可以毫无问题地来回切换。Options 和 Help 屏幕没有实现 viewWillDisappear 方法,在设备上完美地来回切换。

我在 viewWillDisappear 方法下有以下内容:

-(void)viewWillDisappear:(BOOL)animated
{
    [tmrCountdown invalidate];
    [tmrEclapsedTime invalidate];
    [tmrMainEnemyMovement invalidate];
    [tmrMoveSpawnedEnemies invalidate];
    [tmrSpawnEnemies invalidate];
    accInc=currPrefs.accelerometerSensitivity;
    enemySpeedX=5.0;
    enemySpeedY=5.0;
    countdown=4;
    ecMiliseconds=0;
    randTime=0;
    stopped=NO;
    gameStarted=NO;
}

我在这里调用 popToRoot 方法:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex==0)//cancel
    {
         //called here
        [self.navigationController popToRootViewControllerAnimated:YES];
    }
    else //1 (Play Again)
    {
        [self reInit];
    }
}

谢谢, 梅胡尔

4

1 回答 1

0

正如我从代码中看到的那样,您正在使计时器无效,如果您尝试使无效(非重复计时器)无效,则可能会发生这种情况

repeats:NO

或释放定时器。这不是一个例外,所以你不能用 @try 块来捕捉它。这是一个信号。你要做的是:

在您的计时器选择器中,您需要调用

[timer release]; // if you have allocated it
timer=nil;
...
Some action

而在你看来WillDisappear

If (timer!=nil) { 
    [timer invalidate];
    timer=nil;
}
于 2012-08-03T20:44:17.407 回答