Deinitializer
Swift のクラスでは、オブジェクトのクリーンアップ処理は基本的に自動的に行なわれます。
オブジェクトが使われなくなったら勝手にランタイムがクリーンアップしてくれるので、C 言語などのように「メモリの解放」といったような処理を自前でする必要は無くて、 基本的に何もしなくていいわけです。
しかし、例えば OS に関連付くようなファイルハンドルといったリソースは、なるべく速くクリーンアップしたいでしょう。
ここではそうしたクリーンアップに役立つ Deinitializer について説明します。
デイニシャライザ
Swift のオブジェクトは、自動参照カウント (Automatic Reference Counting, ARC) の仕組みがあり、オブジェクトへの参照がどのくらいあるかチェックしています。 参照がなくなったら、もうこのオブジェクトは使われていないということで、解放可能となります。
通常は不要となったオブジェクトは Swift のランタイムが勝手に解放してくれるので、何もしなくていいわけです。
しかし、そのオブジェクトで数少ないシステムリソースを利用している場合は、使わなくなったらなるべく速やかにクリーンアップしたいでしょう。
ARC によってオブジェクトが不要となったときに即座に実行されるコードブロックを記述できる場所が、デイニシャライザ (deinitializer) です。
デイニシャライザは、クラスでのみ利用可能で deinit キーワードを使って記述します。
実行例をみてみましょう。次の例では関数 foo 内で Person オブジェクトを生成しています。Person クラスでは deinit が実装されています。
class Person {
var name : String
init( name : String ){
self.name = name
}
deinit {
print( "[deinit] Bye, \(self.name)!" )
}
}
func foo() {
print( "Entering foo()" )
let p = Person( name : "Ichiro" )
print( "p.name = \(p.name)" )
print( "Exit foo()" )
}
foo()
実行結果
Entering foo() p.name = Ichiro Exit foo() [deinit] Bye, Ichiro!
foo を抜けるときにコンソールに "Exit foo" とプリントして、そのあとに deinit からの出力がプリントされています。