繁体   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