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 からの出力がプリントされています。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Swift による iOS 開発入門