簡體   English   中英

當ActiveReferenceCount> 0時為什么要取消初始化對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM