如何调试“致命错误:在展开可选值时意外发现 nil”

Posted

技术标签:

【中文标题】如何调试“致命错误:在展开可选值时意外发现 nil”【英文标题】:How to debug 'fatal error: unexpectedly found nil while unwrapping an Optional value' 【发布时间】:2015-03-25 08:41:16 【问题描述】:

Stack Overflow 上有很多与此错误相关的问题。我在how Optionals work 和error in particular 上阅读了一些出色的帖子。但是,我还没有找到任何关于确定哪个值被设置为 nil 并首先导致错误的最佳方法的信息。

有没有什么好的调试技术可以找出是哪个 Optional 导致了这个错误?

【问题讨论】:

【参考方案1】:

这里至少有一半的答案(请其他受访者先阅读问题!):使用模拟器而不是实际的 ios 设备。

调试器似乎非常擅长指出导致问题的恶意可选选项的行...除非您像我一样,不时选择直接在 iOS 设备上运行代码。在后一种情况下,调试器将我置于一些汇编代码的中间,而没有明显的堆栈跟踪。切换回模拟器会给出错误的确切代码行。

【讨论】:

谢谢,太好了。很高兴知道! 这是我需要知道的。我知道 what 问题出在哪里,但我需要弄清楚问题出在 哪里 才能解决它,而且我在盲目猜测时设置的断点都没有被击中了。 为我工作。 Xcode 有时就是这样……这有技术原因吗?【参考方案2】:

您的 Xcode 没有在错误的代码行处崩溃?

这不是对问题的回应,但重要的是要注意:

When you are not sure about an optional variable, you have to verify if it contains value or not, by using a pattern like this:

var myOptional : String?
if let aString = myOptional 
    //do your work with aString.

【讨论】:

【参考方案3】:

什么是基本的可选值?当你放置?在一个可选的数据类型之后,如果它被解包并且出现 nil,则没有错误,但你放置“!”数据类型后有感叹号,然后如果它解包变量并出现 nil 则存在崩溃或错误,因此经常使用 optional as

var myVariable : DataType ? = DataType()
or 
var myVariable : DataType ? = nil
or
var myVariable : DataType ? = value

Swift 中的可选项是一个变量,它可以保存一个值,也可以不保存值。可选项是通过附加一个 ?类型:

var myOptionalString:String? = "Hello"

有些地方可选项很有用:

当属性可以存在或不存在时,例如 middleName 或配偶 在 Person 类中 当一个方法可以返回一个值或什么都不返回时,例如 在数组中搜索匹配项 当方法可以返回结果或得到错误时 不返回任何内容 委托属性(不必总是设置) 用于类中的弱属性。他们指向的东西可以 设为 nil 对于可能必须释放到的大型资源 回收内存

https://medium.com/@rrridges/swift-optionals-a10dcfd8aab5

【讨论】:

以上是关于如何调试“致命错误:在展开可选值时意外发现 nil”的主要内容,如果未能解决你的问题,请参考以下文章

Swift 错误致命错误:在展开可选值时意外发现 nil

快速致命错误:在展开可选值时意外发现 nil

如何防止致命错误:在展开可选值时意外发现 nil

如何修复“线程 1:致命错误:在展开可选值时意外发现 nil”错误? [复制]

致命错误:在展开可选值时意外发现 nil。迅速

致命错误:在展开可选值时意外发现 nil - 为啥?