为何ActiveReferenceCount>0时Owner对象仍被销毁?ARC计数疑问
理清ARC引用计数与对象销毁逻辑
嘿,我来帮你把这个ARC的疑惑掰扯清楚~先一步步梳理代码里的引用关系和计数变化,你就能明白为什么Owner会被销毁啦!
先回顾你的类定义
Owner类
class Owner{ var name: String weak var cat:Cat? // 这里是weak引用,不会增加Cat的引用计数 init(name: String){ self.name = name print("Owner class is initialized.") } deinit{ print("Owner class is deinitialized.") } }
Cat类
class Cat{ var name: String var owner: 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"):创建Owner实例,mamun变量强引用它 → Owner引用计数 = 1var vutu: Cat? = Cat(name: "Vutu"):创建Cat实例,vutu变量强引用它 → Cat引用计数 = 1mamun?.cat = vutu:因为cat是weak属性,这个引用不会增加Cat的计数 → Cat引用计数依然是1;同时,weak引用不会让Owner持有Cat的强引用vutu?.owner = mamun:owner是强引用,所以Cat实例现在强引用Owner实例 → Owner引用计数增加到2(一个来自mamun变量,一个来自Cat的owner属性)mamun = nil:mamun变量释放对Owner的强引用 → Owner引用计数降到1(现在只有Cat实例的owner属性还强引用着Owner)vutu = nil:vutu变量释放对Cat的强引用 → Cat引用计数降到0,所以Cat实例被销毁。在Cat销毁时,它持有的对Owner的强引用(owner属性)也会被自动释放,这时候Owner的引用计数就从1降到0了 → Owner实例也随之被销毁
解答你的核心疑惑
你之前的误区在于:以为Owner的引用计数停留在1就不会被销毁,但实际上这个最后的引用来自Cat的owner属性——当Cat被销毁时,这个强引用会被释放,Owner的计数直接归零,自然就触发了deinit。
weak引用在这里刚好打破了潜在的循环引用(如果Owner的cat是强引用,那才会形成两个对象互相强引用、都无法销毁的死循环),而当前的引用链是:vutu变量 → Cat实例 → Owner实例,当vutu被置为nil,整个链就彻底断开,两个对象都会被ARC自动回收。
内容的提问来源于stack exchange,提问作者Kazi Abdullah Al Mamun
相关产品推荐
相关产品推荐

