簡體   English   中英

在邏輯上無主,相當於弱! 在斯威夫特

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM