错误“线程1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)”是什么意思?

时间:2015-03-02 07:32:57

标签: ios swift

我收到了这个错误:

  

主题1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)

我该如何解决这个问题?代码正常工作,但在单击同一个按钮的计算器中,它会给出错误。

@IBAction func equals(sender: AnyObject) {

    secondNumber = Screen.text!.toInt()!  // here it shows an error which is "Thread 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)"

    if operation == "+"{
        result = firstNumber + secondNumber
    }
    else if operation == "-" {
        result = firstNumber - secondNumber
    }
    else if operation == "x" {
        result = firstNumber * secondNumber
    }
    else {
        result = firstNumber / secondNumber
    }
    Screen.text = "\(result)"
}

11 个答案:

答案 0 :(得分:68)

这一行

secondNumber = Screen.text!.toInt()!

表示:获取Screen对象,获取text属性,如果不存在则请崩溃,然后将文本转换为整数,如果不存在则请崩溃。

那是什么!意思是:它意味着“我确定这个东西存在,所以如果不存在则请崩溃”。这就是它的作用。

答案 1 :(得分:9)

通常,EXC_BAD_INSTRUCTION表示代码中存在断言失败。一个疯狂的猜测,你的Screen.text不是整数。仔细检查它的类型。

答案 2 :(得分:8)

我的意思是

  

dispatch_group_leave(组)

如果在封闭中,

在里面。我把它从封闭中移开了。

答案 3 :(得分:3)

就我而言,它是通过传递Core Data受管对象属性的参数来调用函数时发生的。在调用对象时,该对象已不存在,并且导致了此错误。

我通过在调用函数之前检查托管对象是否存在来解决此问题。

答案 4 :(得分:1)

当我尝试同时从另一个线程写入变量时,出现此错误。创建一个专用队列并确保一次有一个线程可以同时写入该变量。就我而言,这是一本字典。

答案 5 :(得分:0)

在我的情况下,这是由整数溢出引起的。我有一个UInt16,并且正在将值加倍以放入Int。错误的代码是

JPanel

但是,它乘以一个UInt16,然后转换为Int。因此,如果myUInt16包含的值超过32767,则将发生溢出。

我将代码更正后,一切都很好

let result = Int(myUInt16 * 2)

答案 6 :(得分:0)

我更仔细地将DispatchQueue.main.sync设置为DispatchQueue.main.async,并且可以正常工作。

答案 7 :(得分:0)

如果其他人也收到类似的错误消息,则您可能在构建该应用程序时启用了optimisations(production)标志,这就是为什么该错误消息没有那么可传达的原因。开发中出现错误的另一种可能性(从i386我知道您正在使用模拟器)。如果是这种情况,请将构建环境更改为开发环境,并尝试重现这种情况以获得更具体的错误消息。

答案 8 :(得分:0)

您的secondNumber似乎是一个ivar,因此您必须使用本地var来解开可选变量。小心点您无需测试secondNumber是否为0,否则可能导致被零除。从技术上讲,您需要另一个案例来处理不可能的操作。例如,检查数字是否为0,在这种情况下不执行任何操作至少不会崩溃。

neo4j://ip

答案 9 :(得分:0)

我在WatchOS Sim上得到了这个。即使在以下情况下,问题仍然存在:

  • 删除应用
  • 重新启动Xcode
  • 删除派生数据

...,并最终通过模拟器中的“删除所有内容和设置”进行了修复。

答案 10 :(得分:0)

尝试清除工作区。

@Produces