Swift: 弱引用可以在可选绑定期间释放吗?

Swift: Can weak reference be deallocated during optional binding?

让我们看看下面的例子

SomeLib.someAsyncFunction { [weak someVariable] in
   if let someVariableU = someVariable {
      // now someVariableU is unwrapped and strong reference created , we can use it as regular
   }
}

我假设可选绑定具有类似于(当然不完全)类似于此的低级实现

if variable != nil {
   return variable!
}

所以,我的问题 - 弱引用引用的对象是否有可能在可选绑定期间被释放,我的意思是对该对象的最后一个强引用被“清除”。如果是这样,在这种情况下会发生什么?

如果“nil 检查将通过”然后它会被释放会发生什么,“强制解包”会发生什么(我使用括号是因为我知道这不是它的工作原理)!

那么,有人能解释一下这种情况是否可能发生,以及会发生什么?

不,在执行可选绑定块期间不会释放对象。

if let someVariableU = someVariable 创建一个强引用,因此只要该强引用还活着,它指向的对象也会活着。

整个结构可以追溯到 Objective-C 天,传统上称为“弱-强舞蹈”。让我解释一下舞蹈的目的。

我们的总体目标是:避免保留循环和内存泄漏的危险。这就是为什么我们说 weak somevariable.

然而,这样做之后,我们确实引入了 somevariable 指向的对象可能被释放的危险。但是,我们通过说 if let 连贯地处理这种危险。方法如下:

  • 当我们在您的代码中输入 first 花括号时,对象 可能 已被释放。但这不是问题。 if let 意味着如果对象已被释放,那么在那种情况下我们得到 nil 而我们什么都不做(我们从不输入 second 大括号)。

  • 如果对象 notfirst 大括号释放,那么 if let 成功,然后,正如 Cristik 所说,if let 创建了一个强引用,现在我们输入 second 大括号保证该对象将完整保留。

因此,我们得到连贯一致的行为。

SomeLib.someAsyncFunction { // someVariable might be deallocated...
   [weak someVariable] in // ...and that is the point of `weak`, to allow that
   if let someVariableU = someVariable { // find out whether someVariable was deallocated
      // if we get here, someVariable was _not_ deallocated...
      // and someVariableU is a strong reference and persists thru this block
   }
}