![](/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.