我正在用Xcode操作系統測試swift結束。爲什麼Swift結束不捕獲自己?
這是我的代碼:
import UIKit
class A{
var closure:()->() = {}
var name: String = "A"
init() {
self.closure = {
self.name = self.name + " Plus"
}
}
deinit {
print(name + " is deinit")
}
}
var a: A?
a = A()
a = nil
不愧是什麼,一個裝在由封閉的自我,所以是永遠不會釋放。
但是,當我在最後一行之前添加此行:
a?.closure = { a?.name = "ttt" }
然後,我發現在輸出窗口,這意味着被釋放「A是DEINIT」。 爲什麼?是不是循環引用?
爲了測試,我使用的功能來設置閉合,其中碼是2版本:
import UIKit
class A{
var closure:()->() = {}
func funcToSetClosure(){
self.closure = { self.name = "BBB"}
}
var name: String = "A"
init() {
self.closure = {
self.name = self.name + " Plus"
}
}
deinit {
print(name + " is deinit")
}
}
var a: A?
a = A()
a?.funcToSetClosure()
a = nil
同樣,也不會脫離。
所以我得到了結論,當閉包由init或類中的函數設置時,會引起循環引用,當它放在類的旁邊時,它不會引起循環引用。我對嗎?
感謝您的幫助,終於我明白了,也感謝Xcode的內存圖。 –