# 循环引用与解决方案

URL: https://caijiao.org/swift/12-memory-arc/03-retain-cycle
Source: docs/swift/12-memory-arc/03-retain-cycle.md
Description: 本章介绍 Swift 中循环引用的成因及解决方案，帮助开发者避免内存泄漏，确保对象正确释放。

## 什么是循环引用

循环引用指两个或多个对象相互持有强引用，导致引用计数无法归零，内存无法释放，造成内存泄漏。

```swift
class Person {
    var apartment: Apartment?
    deinit { print("Person 被释放") }
}

class Apartment {
    var tenant: Person?
    deinit { print("Apartment 被释放") }
}

var person: Person? = Person()
var apartment: Apartment? = Apartment()

person!.apartment = apartment
apartment!.tenant = person

person = nil
apartment = nil
// 由于相互强引用，Person 和 Apartment 都不会被释放，内存泄漏
````

## 解决方案

### 使用弱引用（weak）

将一方的引用声明为弱引用，避免循环引用。

```swift
class Apartment {
    weak var tenant: Person?
}
```

### 使用无主引用（unowned）

适用于引用永远有值的场景。

```swift
class CreditCard {
    unowned let customer: Customer
}
```

### 选择合适引用类型

通常父对象持有子对象为强引用，子对象持有父对象为弱引用或无主引用。

## 总结

通过合理使用弱引用和无主引用，打破循环引用，保证内存正常回收，提升应用性能。
