You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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引用计数 = 1
  • var vutu: Cat? = Cat(name: "Vutu"):创建Cat实例,vutu变量强引用它 → Cat引用计数 = 1
  • mamun?.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:41:26