2014-06-12 33 views
9

在iOS模拟器中运行的我的Swift应用程序正在运行时错误EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, sub code=0x0)的调试器中停止。在Swift标准库中诊断EXC_BAD_INSTRUCTION

按照WWDC 2014 Session 409这通常是由于断言失败。

在Xcode中6的发展现状Beta版,调试程序的堆栈跟踪和上面的错误没有提供足够的信息,看看是什么问题。我如何找出问题所在?

回答

5

看来,这个错误的最常见的来源(在写这篇文章时:Xcode 6 Beta 1)是一些隐式解包可选属性或变量是nil

为了方便起见,最Objective-C的API被桥接到与斯威夫特implicitly unwrapped optionals。它们由感叹号表示的类型声明背后:AnyObject[]!

  • 如果调试器在你的代码将停止,仔细检查线路和寻找隐含展开自选,可能是nil那里。

  • 有时调试器在Swift系统库中的运行时错误会停止。例如,当您将封闭传递给像filtermapreduce等收集方法时,会发生这种情况。然后,运行时错误发生在这些库函数的调用站点上,但是定义可能位于代码的不同部分,您可以在其中定义函数/闭包。在那里寻找可能在运行时为零的隐式解包选项。

为防止agains这类错误的认识,尽管斯威夫特编译器不会强迫你来处理潜在的可可返回nil值,你应该使用optional bindingoptional chainingoptional downcasting无论从客观的返回值-C地可能是nil

让我们希望未来版本的Swift编译器将开始为这种常见类型的问题发出更多有用的诊断消息和错误!

+1

在Beta 3中,您现在将得到一个控制台消息,其效果为“隐式解包可选具有零值”。 –

3

我发现(几个小时后),这个错误可能出现在错误的行上。

例如

enter image description here

正如你可以看到应用程序崩溃我在哪里检查为零,但后来“继续”通过,因为它打印报表。然后它“倒退”并崩溃。

我得出的结论是,有在XCode中的源极 - 映射的错误(7)其中一个零变量是未缠绕。在这种情况下,我有一个变量(在我的代码中更远),这个变量是零并且被解包。

当然,问题是,编译器没有标志,是无实际变量,它标记完全是另一回事。

所以,如果你碰到这个讨厌的错误,经过所有可能的变量,可以是零,并检查它们的展开。你可能会解开一个零,而不是编译器说的那个。

正如在评论中提到的,有编译器优化。这里是一个链接来解决该问题(并找到坠毁的原因路线)

xcode 6.1 how to disable optimization (Swift)

+2

从你的描述来看,这听起来像是你的崩溃发生在优化构建中,我猜测?如果是这样,编译器在优化过程中可能会执行一些代码重新排序,所以... ;-) – Palimondo

+0

是的,关闭这种方式会导致实际需要补救的行 – Aggressor

0

我有同样的问题,因为Palimondo。幸运的是,这只是确保我已经提前初始化了这个项目。在我的代码中,我调用了一个函数来将图像放在UIImageViews中,并传入一个数组中的元素。我还没有加载我的数组与UIImageViews,因此,当代码将运行它会说我传入一个不存在的数组元素。一旦我确定在程序开始时加载我的阵列,错误就消失了。