这些块在相同的情况下总是会失败吗(当关闭被执行但是自己被解除分配时)?
{ [unowned self] in
//use self
self.number = self.number + 1
}
{ [weak self] in
//use self!
self!.number = self!.number + 1
}
答案 0 :(得分:4)
无主引用不保留对self的强引用,但它假设对象总是有一些值(不是nil),并且如果,某些在执行块时自解除分配,上面的代码崩溃了。
对于弱的情况,如在您的示例中,weak是块内的可选类型,因此也可能有值或者它可能是nil。您有责任检查值是否存在并在其上调用方法。如上所述,如果使用展开运算符(!),当self被释放时,它肯定会崩溃。因此,代码的版本都会崩溃,如果它发生了,那么块仍在执行,并且self同时被释放。
因此,我建议使用weak来使用可选的检查来保护此类崩溃,
{ [weak self] in
if let me = self {
me.number = me.number + 1
}
}
答案 1 :(得分:1)
是的,那些是等价的。这就是unowned
的重点 - 它就像weak
一样,除了你不必处理一个可选的并打开它,因为它的类型是未包装的非 - 选择型;它是weak
,每次出现时都会被强行打开。
答案 2 :(得分:1)
应该像这样使用
{ [weak self] in
guard let weakSelf = self else {
return
}
weakSelf.number = weakSelf.number + 1
}
感谢 @José的评论,请注意,即使以下代码目前正常运行,但它被视为编译器错误,应该避免使用https://lists.swift.org/pipermail/swift-evolution/Week-of-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
}