ARC 与内存管理
ARC 自动引用计数、强引用循环、weak/unowned、闭包捕获列表
ARC 与内存管理
Swift 用 ARC(自动引用计数)管理内存——不是 GC,没有暂停。weak/unowned 打破循环引用。
学完本章你将: 掌握 ARC 原理、强引用循环、weak/unowned、闭包捕获。
引用计数
swift
class Person {
let name: String
init(name: String) {
self.name = name
print("\(name) 被创建")
}
deinit {
print("\(name) 被释放")
}
}
var ref1: Person? = Person(name: "小明") // 引用计数 = 1
var ref2 = ref1 // 计数 = 2
ref1 = nil // 计数 = 1
ref2 = nil // 计数 = 0 → deinit → "小明 被释放"
循环引用
swift
class Person {
var apartment: Apartment? // 强引用
}
class Apartment {
var tenant: Person? // 强引用——循环!
}
// person → apartment → person——互相持有,永不释放
weak / unowned
swift
class Person {
var apartment: Apartment?
}
class Apartment {
weak var tenant: Person? // weak——不增加引用计数
// 或 unowned var tenant: Person // 非可选——对象释放后访问会崩溃
}
// Person 释放后 Apartment 的 tenant 自动变 nil
闭包捕获列表
swift
class ViewController {
func setup() {
network.fetch { [weak self] data in
guard let self = self else { return }
self.updateUI(with: data)
}
}
}
// 闭包中 self → [weak self] → 打破循环引用