簡體   English   中英

為什么在你依賴自己的地方指定[無主自我]?

[英]Why specify [unowned self] in blocks where you depend on self being there?

在塊執行期間,我希望自己是非零的,我確信它會是非零的。 那么為什么要明確指定[無主自我]?

object.executeBlock {
    date = self.lastModified
}

VS

object.executeBlock { [unowned self] in
    date = self.lastModified
}

編輯:嗯,我正在投票,所以讓我們再試一次。 問:假設我有問題。 那個問題是我想阻止參考周期。 我有兩個選擇。 我可以使用[無主的自我]或者我可以使用[弱自我]。 因此,我的問題是:從這兩個選項中,為什么我會選擇[無主自我]? 為什么不每次選擇[弱自我]?

“語言指南聲稱如果封閉物和包含物體相互引用並且將同時被摧毀,你應該使用無主物。可能這是為了避免安全地在一個即將釋放的物體中的弱引用“。

http://www.russbishop.net/swift-capture-lists

所以[無主的自我]使自我成為一個隱含的未包裝的選項,為了方便自己不打開它,冒着崩潰的風險,當然它實際上是零。

您真正想要使用[unowned self][weak self]的唯一時間是您創建一個強大的參考周期。 一個強大的參考周期是當存在一個所有權循環,其中對象最終彼此擁有(可能通過第三方),因此它們將永遠不會被釋放,因為它們都確保彼此堅持。

你有一個強大的參考周期嗎?

我在別處回答。 這是克里夫的筆記:

如果封閉使用自我可能是零[弱自我]。

如果自我永遠不會在閉包中使用[無主自我]。

如果你在使用[無主自我]時崩潰了,我猜在封閉的某個時刻自我是零,這就是為什么你不得不選擇[弱自我]。

我非常喜歡手冊中有關使用強,弱和無封閉的手冊的整個部分:

https://developer.apple.com/library/ios/documentation/swift/conceptual/swift_programming_language/AutomaticReferenceCounting.html

為什么[無主自我]? self指向object,object指向executeBlock,executeBlock指向self,創建一個內存循環。

但是當你說[unowned self]時:系統不會將自己保留在內存中以使閉包起作用。 它將假設在執行閉包時self始終存在。 如果不是出於某種原因,將不會有未定義的行為或類似的東西,但您的應用程序將崩潰,因為它是運行時錯誤。

這就是stanford iOS開發老師Paul Hegarty所解釋的。

在閉包中使用self可以想象為nil的情況下,你被迫使用weak語義(或冒着崩潰的風險)。

在你可以推斷self永遠不會是nil ,你可以選擇指定:“選擇”,因為兩者都是正確的並且會起作用。 可以說,一個可以被認為比另一個更“正確”,因為兩個語義都滿足要求,但一個更具體。

您可能希望指定unowned而不是self兩個原因:

  • 方便
  • 文檔

unowned參考將更方便使用,因為它不需要打開。 它也可能更有效,因為編譯器可能不必為安全釋放生成盡可能多的清理代碼。

在文檔方面,你會對你的程序認為是真實的東西做出某種斷言。 如果違反了該假設(假設它是有效的),您可能希望以崩潰的形式找到它。

隨后,這也可能使變量的使用減少耗盡:你想一想並記錄你的理由,它必須始終存在,然后每次你使用它,你不必花費更多的精神能量想知道“什么如果不在這里我該怎么辦?“

可以說,使用let綁定或guard語句也可以實現后者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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