在tic tac toe中出现EXC_BAD_INSTRUCTION错误

时间:2014-11-06 22:52:27

标签: xcode swift

在我的tic tac toe游戏中按“再次播放”按钮后,我们可以重置每个按钮。

当我这样做时:

for var i = 1; i < 9; i++

它不会崩溃,但除了我的左上角按钮外,它会隐藏所有内容。

当我这样做时

for var i = 0; i < 9; i++

崩溃并指示EXC_BAD_INSTRUCTION

显然断点在这里:

 if (gameState[sender.tag]==0 && winner == 0) {

这是playAgainPressed动作

@IBAction func playAgainPressed(sender : AnyObject) {
     goNumber = 1
      winner = 0
      gameState = [0, 0, 0, 0, 0, 0, 0, 0, 0]
      label.center = CGPointMake(label.center.x - 400, label.center.y)
      playAgain.alpha = 0

      var button : UIButton
      for var i = 0; i < 9; i++ {
          button = view.viewWithTag(i) as UIButton
          button.setImage(nil, forState: .Normal)
      }
}

0x108b7d350:ud2

  if (gameState[sender.tag]==0 && winner == 0) {

有什么想法吗?


我将标签更改为100,101等

@IBAction func buttonPressed(sender: AnyObject) {

    if (gameState[sender.tag]==0){


    var image = UIImage()

    if (goNumber%2==0){
    image = UIImage(named: "o")!
        gameState[sender.tag]==2
        }else{

    image = UIImage(named: "x")!
        gameState[sender.tag]==1
    }

    goNumber++

    sender.setImage(image, forState: .Normal)
   }
}

提供此错误

致命错误:数组索引超出范围 (lldb)

它又称它为EXC_BAD_INSTRUCTION。我不知道它有什么问题。

if(gameState [sender.tag] == 0)

这表明出现了问题。它将此部分标记为绿色,并将其命名为EXC_BAD_INSTRUCTION ..

2 个答案:

答案 0 :(得分:0)

最好的猜测是,您有多个带有标记值0的视图,因为它是默认值。所以你可能得到的视图不是Button。或者可能不存在。

viewWithTag返回一个Optional,你没有测试nil。不要忽略对Optionals的测试,不要只是添加一个明确的解包,只会抛出Optional protectctions。

使用标签时请避免使用0.更好的是使用更大的标签,例如:100,101,102 ......

答案 1 :(得分:0)

你可能已经有了

@IBOutlet弱变量按钮:UIButton!

这段代码对我有用:

button.setImage(nil, forState: .Normal)
for var i = 1; i < 9; i++ {
    button = view.viewWithTag(i) as UIButton
    button.setImage(nil, forState: .Normal)
}

如果我使用相同的警告开始使用i = 0,应用程序会一直崩溃所以我只是将按钮图像重置为nil而没有带标记0的按钮标记。我是iOS编程和Swift的新手只是一个修复,而不是一个真正的程序员&#39;解决方案,但希望它有所帮助。