class A {
var b: B
init(b: B) {
self.b = b
}
deinit {
print(" Destroying A" )
}
}
class B {
weak var a: A?
deinit {
print(" Destroying B"/span>)
}
}
func setup(_ a: inout A? , _ b: inout B?) {
b = B()
a = A(b: b! )
b?.a = a
}
var bravo: B?
var alpha: A?
setup(& alpha, & bravo)
bravo = nil
alpha = nil
// OUTPUT:
// " Destroying A"
// " Destroying B"
我已經嘗試了將alpha和bravo設定為nil的所有變化,但我無法讓bravo在alpha之前脫機。根據我在Swift Playgrounds的簡單實驗,alpha總是在bravo之前被洗掉。誰能解釋一下原因?
我知道這與ARC有關,但我想如果bravo = nil,那么alpha.b的值不也是nil嗎?如果是這樣的話,那么在alpha之前安全地洗掉bravo不是很安全嗎?
我很想知道,隨著時間的推移,這些實體的保留數量是多少。
uj5u.com熱心網友回復:
我不確定我是否理解了這個問題,但我認為這是對ARC規則相當直接的應用。在這一行之后
setup(& alpha, & bravo)
你有
- 2個對物件
bravo的強參考(bravo本身,以及其參考alpha.b) - 1個強(
alpha本身)和1個弱(bravo.a)對物件alpha的參考 。
現在你設定了bravo = nil,洗掉了1個強參考,但是另一個強參考仍然存在,所以deinit沒有被呼叫,基于規則:
只要一個實體的至少一個活動參考仍然存在,ARC就不會去分配該實體。
接下來你設定alpha = nil。這是在洗掉它唯一的強參考,因此基于規則
弱參考是一個沒有對它所參考的實體保持強有力的控制的參考,因此不會阻止ARC處置所參考的實體。
A可以立即被拆解。同樣重要的是,要記住
當一個弱參考所指向的實體被洗掉時,ARC會自動將其設定為nil
換句話說,操作順序是:
- 字串參考被洗掉,
。alpha = nil- 由于沒有其他強參考,所有的弱參考都被設定為
。nil- 。
deinit被呼叫因此,現在,
alpha被洗掉了,沒有給bravo留下任何型別的參考,因此它的deinit可以被呼叫。轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/332326.html
標籤:
