Swift 自动引用计数
封面图
•
2025-10-24
•
Swift
8
0
0
0
在 **Swift** 中,**自动引用计数(Automatic Reference Counting,简称 ARC)** 是 Swift 用来管理内存的一种机制。它通过跟踪对象的引用数量来决定何时释放对象,从而避免内存泄漏和野指针问题。 --- ## 🧠 什么是 ARC? ARC 是 Swift 和 Objective-C 中用于管理对象生命周期的机制。它会自动地: - 在对象被创建时增加引用计数; - 在对象被释放或不再被引用时减少引用计数; - 当引用计数变为 0 时,自动销毁对象。 --- ## 🔍 引用计数原理 每个对象都有一个引用计数器,记录有多少个强引用指向它。 | 操作 | 引用计数变化 | |------|---------------| | 创建对象 | +1 | | 赋值给变量/常量 | +1 | | 变量/常量离开作用域 | -1 | | 对象被释放 | -1(变为 0,对象被销毁) | --- ## 📌 强引用(Strong Reference) 默认情况下,所有的类类型(`class`)都是强引用。只要有一个强引用存在,对象就不会被释放。 ```swift class Person { let name: String init(name: String) { self.name = name } } var person: Person? = Person(name: "Alice") // person 是一个强引用,此时引用计数为 1 ``` --- ## 🔄 弱引用(Weak Reference) 弱引用不会增加对象的引用计数,适用于可能为 `nil` 的情况(如 delegate、IBOutlet 等)。 ```swift class Teacher { weak var student: Student? } class Student { var teacher: Teacher? } ``` > ✅ 弱引用必须是可选类型(`Optional`),因为对象可能已经被释放了。 --- ## 🧩 无主引用(Unowned Reference) 无主引用类似于弱引用,但它假设对象始终存在,不会为 `nil`。适用于不会变为空的对象(如父类对子类的引用)。 ```swift class Student { unowned let teacher: Teacher init(teacher: Teacher) { self.teacher = teacher } } ``` > ⚠️ 如果你尝试访问一个已经释放的对象,会导致运行时错误(crash)。 --- ## 🧨 循环引用(Retain Cycle) 当两个或多个对象互相持有对方的强引用时,就会形成循环引用,导致它们无法被释放。 ```swift class A { var b: B? } class B { var a: A? } var a: A? = A() var b: B? = B() a!.b = b b!.a = a ``` 这时 `a` 和 `b` 都无法被释放,造成内存泄漏。 ### ❌ 解决方案: 将其中一个引用改为 **weak** 或 **unowned**: ```swift class A { weak var b: B? } class B { var a: A? } ``` --- ## ✅ 总结 | 类型 | 是否增加引用计数 | 是否可以为 nil | 适用场景 | |------|------------------|----------------|----------| | Strong(默认) | ✅ | ❌ | 默认使用 | | Weak | ❌ | ✅ | 委托、IBOutlet 等可能为 nil 的引用 | | Unowned | ❌ | ❌ | 确保对象不会被释放的引用 | --- 如果你有具体的代码或场景,我可以帮你分析是否有内存泄漏或引用问题 😊
上一篇:
Swift 可选链
下一篇:
Swift 扩展
标题录入,一次不能超过6条
返回顶部
留言
留言
评论