我正在阅读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
代码执行后它被取消初始化。我在计算参考时做错了吗?
答案 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