[英]Swift, how much of “self” do closures capture?
我對這種情況感到困惑:
A類將轉義的閉包Z交給某個全局隊列。
在閉包Z中,我們稱A類為類,而B類僅從A類中引用。
在閉包Z從類B調用函數之前,類B被清除了。
B級對此時的封閉Z意味着什么? 在捕獲時還是舊的B還是新的Nil? (假設B是代表)
==
另一個跟進問題是,如果閉包Z調用的B類函數在B類中引用了更多東西,那么B的“自我”是如何被捕獲的呢?
我感到困惑的原因是,在閉包Z中,我可以指定[弱自我],但是對於要在類B中調用的函數,我不能這樣做。
and class B who is only referenced from class A.
這意味着兩件事:
B
實例是一個很強的屬性,至少在A
實例被釋放之前不會被釋放,並且A
實例直到閉包結束才被釋放。
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.