在闭包中展开先前选中的可选项时崩溃

Crash with unwrapping a previously checked optional in a closure

提问人:Dmitry 提问时间:9/15/2023 更新时间:9/15/2023 访问量:29

问:

我有一个非常罕见的崩溃,可能涉及一个完美的时机(关闭应用程序或进入后台状态?此代码的最后一行

  fileprivate static func showNextDialog()
  {
    let next=futureDialogs.first
    if next != nil
    {
      futureDialogs.remove(next!)
      delay(0.01){showDialog(next!)}
    }
  }

导致以下崩溃

#0  (null) in Swift runtime failure: Unexpectedly found nil while unwrapping an Optional value ()
#1  0x00000001049ff7ac in closure #1 in static InterfaceManager.showNextDialog() at ...
#2  (null) in partial apply for closure #1 in static InterfaceManager.showNextDialog() ()

功能延迟如下:

func delay(_ delay:Double,_ closure:@escaping ()->())
{
  DispatchQueue.main.asyncAfter(
    deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: closure)
}

唯一的可选变量是用 let 捕获的,并选中了 。有人对发生的事情有想法吗?nextnil

快速 崩溃 关闭

评论

0赞 Joakim Danielson 9/15/2023
也许不相关,但为什么不将获取和检查 nil 的两行合并到 ?nextif let next = futureDialogs.first {

答:

0赞 lazarevzubov 9/15/2023 #1

是什么类型?它看起来像一个引用类型,这意味着您不会捕获它的值,而只会捕获值的地址。next

在等待 时,的值可能会更改为 。作为可能的修复,您可以在 的完成处理程序中检查它是否是第二次:showNextDialogdelaynextnilnildelay

delay(0.01) {
  if let next {
    showDialog(next)
  }
}

P.S. 一个相关的小建议:避免强制解开并接受 / 语法,而不是检查是否相等。guard letif letnil

评论

0赞 Dmitry 9/15/2023
static var futureDialogs=[UIViewController]()所以是nextUIViewController?