ARC(Automatic Reference Counting)の仕組み

Swiftのメモリ管理は、**ARC(Automatic Reference Counting:自動参照カウント)**という仕組みによって行われています。ARCは、オブジェクト(インスタンス)のライフサイクルを管理するための自動的な仕組みであり、プログラマが明示的にメモリを確保・解放する必要をなくします。


ARCの基本的な仕組み

ARCは、クラスのインスタンスがどれだけ参照されているかを追跡することで、インスタンスが不要になったときに自動的にメモリを解放します。具体的には次のように動作します:

  1. 参照カウント(Reference Count)
    各インスタンスは、**それを参照している変数や定数の数(参照カウント)**を持ちます。

  2. 参照が増えるとカウントが増加
    新しくそのインスタンスを別の変数に代入したり、関数の引数に渡したりすると、参照カウントが1つ増えます。

  3. 参照が減るとカウントが減少
    参照がスコープから外れたり、nilを代入したりすると、参照カウントが1つ減ります。

  4. 参照カウントが0になると、インスタンスは自動的に解放
    誰からも参照されなくなった時点で、そのインスタンスのメモリは解放されます。


基本例

swift
class Person { let name: String init(name: String) { self.name = name print("\(name) が初期化されました") } deinit { print("\(name) が解放されました") } } var person1: Person? = Person(name: "Taro") var person2: Person? = person1 person1 = nil // 参照カウントはまだ 1(person2 が参照) person2 = nil // 参照カウントが 0 → メモリが解放される

ARCの課題:循環参照(Strong Reference Cycle)

ARCでも問題が発生することがあります。それが**循環参照(retain cycle)**です。

たとえば、2つのインスタンスがお互いを強参照していると、どちらの参照カウントも0にならないため、メモリが解放されません

swift
class A { var b: B? } class B { var a: A? }

このようなケースでは、ABが互いに強参照し合うことで循環参照が発生します。


解決策:weakunowned

循環参照を防ぐために、片方の参照を「弱い参照(弱参照)」にする必要があります。

  • weak:参照先が解放されると自動でnilになる(オプショナル型に使う)

  • unowned:参照先が先に解放されることを想定しない(非オプショナル)

修正例(weakを使う)

swift
class A { var b: B? } class B { weak var a: A? }

このようにすることで、ARCによって正しくメモリが解放されるようになります。


まとめ

項目 内容
管理方法 自動(ARCによる参照カウント)
対象 クラスのインスタンス(構造体や列挙型は値型なので対象外)
問題点 循環参照によるメモリリークの可能性
解決策 weakunowned を使って参照関係を調整する

生成日:2025/05/04