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 大括号)。
如果对象 not 被 first 大括号释放,那么 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
}
}
让我们看看下面的例子
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 大括号)。如果对象 not 被 first 大括号释放,那么
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
}
}