[英]Why object is being deinitialized when ActiveReferenceCount > 0
我正在閱讀有關ARC
並對增加Reference Count
感到困惑。 我的示例代碼如下。
我的第一堂課:
class Owner{
var name: String
weak var cat:Cat? //Cat reference count will not increase because of 'weak'
init(name: String){
self.name = name
print("Owner class is initialized.")
}
deinit{
print("Owner class is deinitialized.")
}
}
我的第二堂課:
class Cat{
var name: String
var owner: Owner?
init(name: String){
self.name = name
print("Cat class is initialized.")
}
deinit {
print("Cat class is deinitilized.")
}
}
我的班級用法代碼:
var mamun: Owner? = Owner(name: "Mamun") //OwnerAR = 1
var vutu: Cat? = Cat(name: "Vutu") // CatAR = 1
mamun?.cat = vutu // CatAr = 1
vutu?.owner = mamun // OwnerAR = 2
mamun = nil // OwnerAR = 1
vutu = nil // CatAR = 0
輸出:
所有者類已初始化。
Cat類已初始化。
Cat類已取消初始化。
所有者類被取消初始化。
結論:當Owner
引用計數為1時,為什么在執行vutu = nil
代碼后將其vutu = nil
。 我在計算參考文獻上做錯了嗎?
當您將vutu
設置為nil
,該對象的引用計數將為零,並且將按預期進行初始化。 在取消初始化的過程中,它將釋放對其擁有的對象的所有強引用。 因此其owner
被釋放。 這會使mamun
變量引用的對象的引用計數為0。 這就是為什么您看到Owner class is deinitialized.
的最后一條消息Owner class is deinitialized.
。
mamun?.cat = vutu // CatAr = 1 (1 by vutu)
vutu?.owner = mamun // OwnerAR = 2 (1 by vutu's owner and another by mamun)
mamun = nil // OwnerAR = 1 (1 by vutu's owner) == cannot deinit until vutu deinit
vutu = nil // CatAR = 0 == vutu deinit == OwnerAR = 0 == mamun deinit
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.