はじめに
ドキュメントを自分なりに和訳し簡単にまとめました. 間違いがあれば指摘をお願いします
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
と出力されました. インスタンスのメモリの割り当てが解除されたということです.
次回は循環参照についてまとめてみたいとおもいます.
ありがとうございました.