Swift

[Swift] ARCについて [和訳]

はじめに

ドキュメントを自分なりに和訳し簡単にまとめました. 間違いがあれば指摘をお願いします

ARC(Automatic Reference Counting)とは

Swiftではメモリの追跡、管理にARCが用いられている. ARCはいらなくなったインスタンスのメモリの割り当てを自動的に解除する. ガベージコレクトの一種.

ARCの働き

ARCはインスタンスのメンバを追跡しており, 参照が残っているかどうかを見ている.
変数のweak, strongはここに関連してくる. 強い参照が残っている限り, インスタンスのメモリ割り当ては解除されない(アクティブな参照が存在するということ)

ARCの動作

ARCの動きを見るために以下のようなPersonクラスを定義します.

class Person {

    let name: String

    init(name: String) {
        self.name = name
        print("\(name) is being initialized")
    }

    deinit {
        print("\(name) is being deinitialized")
    }

}

Pesonクラスはnameというメンバを持っており、インスタンスが生成されると

hoge is being initialized

と出力されます. (ここではname = hoge)
また、インスタンスのメモリの割り当てが解除されるとdeinitが呼ばれ、

hoge is being deinitalized

と出力されます.

インスタンスの動きを見ていきましょう

var reference1: Person?
var reference2: Person?
var reference3: Person?

と宣言し

reference1 = Person(name: "kyrie")

インスタンスを生成, 代入すると、
kyrie is being initialized
と出力されました. この時kyrieへの強い参照の数は1となります.

また,

reference2 = reference1
reference3 = reference1

とするとkyrieへの強い参照の数は3となりました.

ここで、参照を減らして見るとどうなるでしょう

reference1 = nil
reference2 = nil

参照を2つ減らしました. ここまではなにも出力されません. 強い参照が1つ残っているためです.

reference3 = nil

3つ目の参照を解いて見ました. すると

kyrie is being deinitialized

と出力されました. インスタンスのメモリの割り当てが解除されたということです.

次回は循環参照についてまとめてみたいとおもいます.
ありがとうございました.

参考

The Swift Programming Language (Swift 4.0.3)