0

让我们检查以下示例

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 检查将通过”然后它会被释放会发生什么,“强制展开”会发生什么(我使用括号,因为我知道它不完全是这样工作的)!

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

4

2 回答 2

2

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

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

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

  • 当我们在代码中输入第一个花括号时,该对象可能已被释放。但这不是问题。这意味着如果对象已被释放,那么在这种情况下我们得到并且我们什么都不做(我们从不输入第二个花括号)。if letnil

  • 如果对象没有第一个花括号释放,那么if let 成功,然后,正如 Cristik 所说,if let创建一个强引用,现在我们输入第二个花括号,保证对象将保持完整。

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

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
   }
}
于 2020-11-26T19:29:42.170 回答
1

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

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

于 2020-11-26T17:28:44.233 回答