![](/img/trans.png)
[英]What's the difference in Swift between unowned vs weak but implicitly unwrapped?
[英]Is unowned logically equivalent to weak! in Swift
这些块总是会在相同的情况下失败(当关闭被执行但是自我被解除分配时)?
{ [unowned self] in
//use self
self.number = self.number + 1
}
{ [weak self] in
//use self!
self!.number = self!.number + 1
}
无主引用并不保留对self的强引用,但是它假设对象总是有一些值(不是nil),并且如果某些对象在执行块时自行解除分配,则上面的代码崩溃。
对于弱的情况,如在您的示例中,weak是块内的可选类型,因此也可能有值或者它可能是nil。 您有责任检查值是否存在并在其上调用方法。 如上所述,如果使用展开运算符(!),当self被释放时,它肯定会崩溃。 因此,代码的版本都会崩溃,如果它发生了,那么块仍在执行,并且self同时被释放。
因此,我建议使用weak来使用可选的检查来保护此类崩溃,
{ [weak self] in
if let me = self {
me.number = me.number + 1
}
}
是的,那些是等价的。 这是unowned
的点 - 它就像weak
一样,除了你不需要处理一个可选的并解开它,因为它的类型是unwrapped非可选类型; 它很weak
,总是在每次出现时被强行打开。
应该像这样使用它
{ [weak self] in
guard let weakSelf = self else {
return
}
weakSelf.number = weakSelf.number + 1
}
感谢@José的评论,请注意,即使以下代码目前有效,但它被认为是编译器错误,应该避免使用https://lists.swift.org/pipermail/swift-evolution/Week- -Mon-20160118 / 007425.html 。
你也可以这样打开self
:
{ [weak self] in
guard let `self` = self else {
return
}
// Now you can use `self` safely
self.number = self.number + 1
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.