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