簡體   English   中英

Swift,閉包捕獲了多少“自我”?

[英]Swift, how much of “self” do closures capture?

我對這種情況感到困惑:

  1. A類將轉義的閉包Z交給某個全局隊列。

  2. 在閉包Z中,我們稱A類為類,而B類僅從A類中引用。

  3. 在閉包Z從類B調用函數之前,類B被清除了。

  4. B級對此時的封閉Z意味着什么? 在捕獲時還是舊的B還是新的Nil? (假設B是代表)

==

另一個跟進問題是,如果閉包Z調用的B類函數在B類中引用了更多東西,那么B的“自我”是如何被捕獲的呢?

我感到困惑的原因是,在閉包Z中,我可以指定[弱自我],但是對於要在類B中調用的函數,我不能這樣做。

and class B who is only referenced from class A.

這意味着兩件事:

  1. B實例是一個很強的屬性,至少在A實例被釋放之前不會被釋放,並且A實例直到閉包結束才被釋放。

  2. B實例是一個弱屬性,可能隨時被釋放(在這種情況下, A實例無話可說)。 但是同時,這意味着B實例必須是可選的,因此編譯器將迫使您正確處理被釋放的情況(當然,您可以強制對其進行拆包,但這是您的問題)。

僅從A類引用的B類。

我認為您在A意思是這樣A

var objB: B?

在閉包Z從類B調用函數之前,類B被清除了。

好吧,只有一種方法可以清除B

objB = nil

現在,當您在閉包中調用B的方法時,您將得到“在展開一個可選值時意外發現nil”。

這是因為您僅在閉包中捕獲了self ,即A 您根本沒有捕獲到B B的實例由A的強引用保留。 基本上, B沒有被閉包捕獲。

我感到困惑的原因是,在閉包Z中,我可以指定[弱自我],但是對於要在類B中調用的函數,我不能這樣做。

好吧,雖然您可以捕獲B 像這樣:

[b = self.objB] in ...

您也可以使其變弱:

[weak b = self.objB] in ...

這樣,您還可以捕獲閉包中的B。

暫無
暫無

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

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