gpt4 book ai didi

ios - 可选的意外发现 nil 和崩溃日志信息

转载 作者:行者123 更新时间:2023-11-28 09:59:31 25 4
gpt4 key购买 nike

我昨天遇到了这个问题。我正在处理一段生产代码,该代码在某个时刻崩溃并带有此崩溃信息

0   Goga  0x00000001000b90b8 function signature specialization <Arg[0] = Owned To Guaranteed, Arg[1] = Owned To Guaranteed> of Goga.NewViewController.emailButtonPressed (Goga.NewViewController)(ObjectiveC.UIButton) -> () (NewViewController.swift:0)
1 Goga 0x00000001000c0488 Goga.NewViewController.(emailButtonPressed (Goga.NewViewController) -> (ObjectiveC.UIButton) -> ()).(closure #2) (NewViewController.swift:872)
2 Goga 0x00000001000bd250 partial apply forwarder for reabstraction thunk helper from @callee_owned (@in ObjectiveC.UIAlertAction!) -> (@out ()) to @callee_owned (@owned ObjectiveC.UIAlertAction!) -> (@unowned ()) (NewViewController.swift:0)

然而,当我发现该错误时,在尝试重现该问题数小时后,在崩溃日志中找不到任何关于它的错误消息。该错误在 XCode 中显示为:

unexpectedly found nil while unwrapping an Optional value

我的问题是,如何捕获生产代码中的 nil-optional 错误?

编辑:

只是为了增加对原始问题的看法,我在这段示例代码中发现了问题:

let cell = tableView.cellForRowAtIndexPath(indexPath)  
cell.textLabel.text = "Hello" // CRASH if the cell is not visible in the view

我应该这样做:

if let cell = tableView.cellForRowAtIndexPath(indexPath) {
cell.textLabel.text = "Hello" // Never get executed if cell is nil
}

最佳答案

“捕获”“nil-optional 错误”的方法很简单,只需正确编写代码即可。不要滥用强制解包和强制向下转换。

在这种特定情况下,只需阅读崩溃详细信息即可为我们提供一些信息:

1   Goga  0x00000001000c0488 Goga.NewViewController.(emailButtonPressed (Goga.NewViewController) -> (ObjectiveC.UIButton) -> ()).(closure #2) (NewViewController.swift:872)

NewViewController.swift 的第 872 行附近的某处,您正在强制解包实际上是 nil 的东西(因此无法解包)。

解决方案是转到 NewViewController.swift 的第 872 行,找到任何出现的感叹号,确定它是强制展开运算符还是 bool 运算符……如果它是一个强制展开运算符,使用 Swift 的可选绑定(bind)设计模式修复它。

可能是你在做这样的事情:

let foo = bar!

或者也许某处 bar 声明如下:

var bar: AnyObject!

然后它永远不会被初始化(或者在某个时候设置为 nil)然后因为它被隐式解包,所以你正在做这样的事情:

let foo: AnyObject = bar

这些都可能导致您正在查看的错误。

是的,隐式解包选项和强制解包可以让你在编写代码时稍微方便一些,但最终,这意味着你会遇到这些问题,你必须在以后最终找到这些问题。当 Swift 有足够的工具来确保我们安全地使用 nil 时,就没有必要这样做了。

关于ios - 可选的意外发现 nil 和崩溃日志信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31026910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com