为什么在ActiveReferenceCount>时对象被取消初始化? 0

时间:2018-05-14 15:44:09

标签: ios swift automatic-ref-counting

我正在阅读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类已初始化。
  猫类被去除了毒性   所有者类被取消初始化。

问题:当Owner引用计数为1时,为什么在vutu = nil代码执行后它被取消初始化。我在计算参考时做错了吗?

2 个答案:

答案 0 :(得分:3)

当您将vutu设置为nil时,该对象的引用计数将变为零,并且会按预期取消初始化。在取消初始化的过程中,它会释放对其拥有的对象的任何强引用。所以它的owner被释放了。这会使mamun变量引用的对象的引用计数为0。这就是为什么你看到Owner class is deinitialized.的最后一条消息。

答案 1 :(得分:1)

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