簡體   English   中英

可選關閉是否總是 escaping? 我們應該在上面使用[weak self]還是[unowned self]?

[英]Is optional closure always escaping? Should we use [weak self] or [unowned self] on it?

UICollectionView中給出以下 function 簽名。

open func performBatchUpdates(_ updates: (() -> Void)?, completion: ((Bool) -> Void)? = nil)

Internet 上有一些選項,可選閉包始終為 escaping。 但是,我真的不確定這是真的,或者這仍然值得商榷。

  1. https://forums.swift.org/t/allowing-escaping-for-optional-closures-in-method-signature/27556
  2. https://gist.github.com/gringoireDM/1f18f3bb4e74e2d914a748d89486db56

對於上述情況,我們是否需要[weak self][unowned self]在第一個區塊和第二個黑色?

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
    collectionView!.performBatchUpdates({ () -> Void in
        for operation: BlockOperation in self.blockOperations {
            operation.start()
        }
    }, completion: { (finished) -> Void in
        self.blockOperations.removeAll(keepingCapacity: false)

        self.collectionView.reloadData()
    })
}

根據編譯器(它有唯一對這種事情重要的“意見”),一個可選的閉包參數總是隱含@escaping 通過編寫一個采用可選閉包並將其標記為@escaping的 function 自己進行測試。 編譯器會通知你它已經是 escaping。

至於您是否應該將self捕獲為weakunowned ,這取決於。 首先,我會遠離將self捕獲為unowned ,除非您希望您的程序在您對self的生命周期有誤時崩潰 - 您可能會這樣做。 我寧願我的程序崩潰也不願默默地做錯事。

但這留給是否被俘虜一樣weak 我的意見是肯定的,如果您對捕獲強引用有任何疑問,則會創建一個阻止其正確取消初始化的引用循環。 但我不會 go 說總是從不做某事。 如果您能夠推斷出對象的生命周期,以便知道閉包將在 object 通常被取消初始化之前運行和處理,那么只需將其捕獲為強參考。 如果您為了關閉而有意延長 object 的使用壽命,並且您知道關閉將被執行和處理,也可以通過強引用捕獲。

還有一種情況是你知道盡管隱含地@escaping它實際上並沒有逃脫。 通常這是針對在您的代碼庫中定義的 function 以便您可以查看實現,但實際上任何時候閉包只是在您調用返回的 function 之前必須完成的工作的自定義點,您可以推斷它實際上並沒有逃脫。 完成處理程序不是這種情況,但它可能適用於其他事情。

這是我的意見。 我喜歡認為這是一個知情的,但其他人可能不同意。

暫無
暫無

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

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