线程1:EXC_BAD_ACCESS(code = 2,address = 0x0){inside switch case}

问题描述:

我已经在storboard中创建了一个带有两个viewcontrollers的导航控制器。第一个视图控制器有一个从第二个视图控制器开始的开始按钮。在第二个视图控制器中,我放置了一个包含三个片段的片段控件:人,卡车,电影。线程1:EXC_BAD_ACCESS(code = 2,address = 0x0){inside switch case}

在第二个viewcontroller的实现文件中声明并定义了setActiveModel方法。该方法在段控制中具有三段的切换情况。

最后在用于段控制的IBaction里面调用了这个setActive方法。

- (void) setActiveModel: (int) modelIndex 
{ 
    switch (modelIndex) 
    { 
     case 0: 
      m_truckModel->setVisible(false); **---->>[ I get BAD_ACCESS error in this line which steps over in the debugger to viewdidload method to the line where I initialize setActiveModel to integer 0 ] <<-----** 
      m_metaioMan->setVisible(true); 

      // stop the movie 
      m_moviePlane->stopMovieTexture(); 
      m_moviePlane->setVisible(false); 
      m_moviePlaneButton->setVisible(false); 
      break; 

     case 1: 
      m_truckModel->setVisible(true); 
      m_metaioMan->setVisible(false);   

      // stop the movie 
      m_moviePlane->stopMovieTexture(); 
      m_moviePlane->setVisible(false); 
      m_moviePlaneButton->setVisible(false); 
      break; 

     case 2: 
      m_truckModel->setVisible(false); 
      m_metaioMan->setVisible(false); 

      m_moviePlane->setVisible(false); 
      m_moviePlaneButton->setVisible(true); 
      break; 
    } 
} 

- (IBAction)onSegmentControlChanged:(UISegmentedControl*)sender 
{ 
    [self setActiveModel:sender.selectedSegmentIndex]; 
} 
+0

[我得到了BAD_ACCESS错误,在调试器中将viewdidload方法转移到了我将setActiveModel初始化为整数0的那一行。] ---- ---- – strawberry 2012-07-10 11:53:09

+0

您的m_truckModel在到达该行代码之前已经发布。检查(并)发布你如何初始化m_truckModel以及如何释放它。 它正在自动发布? – Maggie 2012-07-10 11:55:16

+1

我建议在乐器中运行你的应用程序(并选择僵尸)。我的猜测是,m_truckModel发布的地方超过了它的保留范围(您是否使用ARC?) – user1071136 2012-07-10 11:55:56

您可以使用工具来找出代码中发生过度释放的位置。 这里是如何使用仪器的链接。 Eliminating Messages To Deallocated Objects

你有没有试过用

[self.m_truckModel setVisible:NO]; 

它是一个有些奇怪的编码方式。 你也应该查看故事板。