在Swift标准库中诊断EXC_BAD_INSTRUCTION

Pal*_*ndo 9 swift

在iOS模拟器中运行的我的Swift应用程序在调试器中因运行时错误而停止EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, sub code=0x0).

根据WWDC 2014 Session 409,这通常是由于断言失败.

在Xcode 6的当前开发Beta版本中,调试器的堆栈跟踪和上述错误无法提供足够的信息来查看问题所在.我如何找出问题所在?

Pal*_*ndo 5

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

为方便起见,大多数Objective-C API都使用隐式解包的选项桥连接到Swift .它们在类型声明后面用感叹号表示:AnyObject[]!

  • 如果调试器在代码中停止,请仔细检查该行并查找可能nil存在的隐式解包的选项.

  • 有时调试器会在Swift系统库深处停止运行时错误.出现这种情况,例如当你通过封闭来收集方法,如filter,map,reduce等人.然后,运行时错误发生在这些库函数的调用位置,但定义可能位于代码的不同部分,您定义了函数/闭包.查看那些在运行时可能为零的隐式解包选项.

为了防范这些错误,请注意尽管Swift编译器不会强制您处理nil从Cocoa返回的潜在值,但您应该使用可选绑定,可选链接可选的向下转换,而不管Objective-C land的返回值是什么nil.

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