Z
ZHANK
错误与内存

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] → 打破循环引用