結論:本測試主要得出的結果是weak屬性是在屬性調用deinit or dealloc前被設置nil
1> 驗證代碼如下(swift)
class WeakTest {
weak var obj: AnyObject?
deinit {
print(obj) /// nil 當前實例對象在deinit完全釋放前,weak obj對象就已經被設置nil
print(self)
/// 等deinit完成后,才會使用free釋放空間,真正銷毀
}
init() {
obj = self
}
}
2> 銷毀調用順序:
- {count = 0}
- {weak = nil}
- {self -> (super) -> 屬性} <dealloc deinit> 父類的dealloc會在子類dealloc返回后自動調用
- {解除關聯屬性 Associate <釋放空間>}
- {解除weak屬性<不解除,當weak屬性為nil時,反找屬性設置nil會段錯誤>}
- free
可以參考一下: dealloc內部原理
3> dealloc deinit 不需要調用super理解
- 對于OC,比較好理解dealloc的調用,但swift還是存在一些疑惑,由于沒有[super dealloc],OC可以根據selector在自己的方法列表找,找到就直接調用(不是發消息,消息會遞歸到父類),但swift沒有運行時,那么是不是在編譯的時候根據代碼有沒有deinit就直接綁定函數地址進行調用?