Swiftはクラスのメモリ管理にARCという方式を採用しています。
ARCでは、インスタンスが初めて生成された時に参照カウントが1になり、以降そのインスタンスへの参照が増えると参照カウントがインクリメントされ、減るとデクリメントされます。そして、参照カウントが0になると、インスタンスも自動的に破棄されます。
デイニシャライザ
class クラス名 {
deinit {
クリーンアップなどの終了処理
}
}
ARCによってインスタンスが破棄されるタイミングで、クラスのデイニシャライザが実行されます。
初期化は一番最初に呼ばれるイメージですが、デイニシャライザはメモリがすべて開放された後の一番最後に呼ばれるというイメージです。なので、デイニシャライザの中にはクリーンアップなどの終了処理を実装します。
値の比較と参照の比較
class SomeClass: Equatable {
static func ==(lhs: SomeClass, rhs: SomeClass) -> Bool {
return true
}
}
let a = SomeClass()
let b = SomeClass()
let c = a
// 値は同じ
a == b // true
// 参照先は別
a === b // false
// aとcの参照先は同じ
a === c // true
参照先の値の比較と、参照先の比較は別になります。
値比較は==, 参照先比較は===を使用します。