【问题标题】:fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)致命错误:在展开可选值 (lldb) 时意外发现 nil
【发布时间】:2016-02-29 12:24:27
【问题描述】:

好的,我正在使用 AVFoundation 来扫描条形码。然后一旦扫描转到另一个视图。效果很好。但是,应用程序会随机崩溃。仍然显示相机预览,只是无法正常工作。我得到了错误:

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

我相信这可能是由于它试图在尚未加载的情况下访问某些内容。如果我错了,请纠正我。

那么,我要问的是如何解决这个问题?

如果有任何帮助,我也附上了线程。

【问题讨论】:

  • 您是否已经添加了所有异常断点?如果没有,那么这样做并查看错误被抛出的位置。很可能你会发现一些可选项在访问其内容时使用感叹号未选中。
  • @HermannKlecker 抱歉,我对 iOS 开发很陌生。所有异常断点是指 (!) 吗?如果是这样,我会在哪里添加它
  • 如果您不发布代码,我们将无法帮助您。
  • 在断点导航器中单击 + 号添加一个,然后选择一个异常断点。这将使您的应用程序在抛出异常之前停止在调试器中。这样做,您可以轻松定位大约 98% 的异常的根本原因。
  • @JoshuaNozzi pastebin.com/xeYNQD9W

标签: ios swift


【解决方案1】:

在 Swift 中,Optionals 是一种特殊的泛型类型:

  • 可以包含一个值
  • 或根本没有价值(无)

一个变量只有在它是可选的时候才能为 nil。你声明一个这样的可选:

let meaningOfLife:Int? = 42

问号?在类型声明的末尾表示变量meaningOfLife 是可选的。因此,这段代码是可以的:

meaningOfLife = nil

变量meaningOfLife是可选的,所以可以为nil。

然而,这个例子是无效的:

let age:Int = 99
age = nil // This line is not OK

因为年龄不是可选项,所以不能为零!

Optional 是 Swift 的一项强大功能,因为它们使您的代码更安全且不易出错。因此,作为开发人员,可选项可以提高您的工作效率,因为您在修复错误上花费的时间更少。

几乎每一种编程语言都有类似于 nil 的东西。它在 JavaScript 中未定义,在 Java 中为 null,在 PHP 中为 NULL。在这些语言中,为了避免变量没有值的运行时错误,您必须记住检查变量是否为空。那是你可以忘记的……

Swift 以一种特殊的方式处理可选项:它强制开发人员检查变量是否为 nil,如果它是可选项。这称为展开。您需要先打开一个可选项,然后才能使用它。

当您忘记打开可选选项时,您会在应用运行之前发现,这样可以节省您的时间。这使您的工作效率更高,代码错误更少。

与其他语言不同,Swift 会在编译时检查可选项是否正确解包。所以在应用程序运行之前,当代码被编译时,Swift 会检查你代码中的每一个可选项,看看你是否正确地解包了它。

很遗憾,编译器无法捕获某些错误。那时你会看到这个错误。

这会在您的应用运行时发生,在以下情况下:

  • 您已使用 ! 强制解包一个可选项。
  • 隐式展开的可选项为 nil

在强制解包可选选项之前,您使用 if 语句检查可选选项是否为 nil。当 optional 为 nil 时,花括号 { } 内的代码不会被执行。

【讨论】:

    猜你喜欢
    • 2015-03-04
    相关资源
    最近更新 更多