質問: アプリをobjective-Cからswiftへ移行させていこうと考えています。 以下はAppDelegate.mでの`UIWindow *window;`のdeallocです。 objective-Cで書いている時は以下のようにdeallocでrelease処理を記述していたのですが、 swiftだとreleaseが無いのでどうすれば同じように解放処理を行えるかで悩んでいます。 ``` - (void)dealloc{ [_window release]; [super dealloc]; } ``` swiftでは特に処理を書く必要はないのでしょうか? また、記述が必要な場合というのはどういう時かも教えていただけると幸いです。 初心者なので、質問するにあたり足りない情報が多々あると思います。 その点もご指摘頂けると尚幸いです。 よろしくお願いします。
回答: *swiftでは特に処理を書く必要はないのでしょうか?* 提示されたような定型的なreleaseはSwiftでは書く必要はありません。releaseが不要なので、多くの場合でdeallocを書くことさえ必要なくなります。 この辺りは、Objective-CでもARCを使っていれば比較的受け入れやすいと思います。まだ試したことがなければXcodeのEditメニューにConvert>To Objective-C ARC...と言うのがありますので、簡単なObjective-Cプロジェクトに適用してみてください。releaseが片っ端から削除されてしまうのがわかると思います。 ARCというのは簡単に言うと「コンパイラーがrelease, retainが必要だと思ったら自動的にその場所にそのコードを生成しちゃいます」と言う機能で、ARCを有効にしてコンパイルしたアセンブリを参照すると、retain, releaseがあちこちに埋め込まれているのがわかります。 と言うわけでSwiftではデフォルトでARCが有効であり、設定などでオフにすることはできません。通常のアプリを書くのであればrelease, retainなどを自分で書く必要は一切ないでしょう。 (ついでに言うと、Objective-CのARCでは管理してくれなかったCFTypeのrelease, retainも自動的にやってくれるので、CFなんとかを多用する場合大変楽なのですが、Objective-CのARCを使ったことがないとありがたみが薄いかも知れません。) *また、記述が必要な場合というのはどういう時かも教えていただけると幸いです。* 基本的には上に書いたように記述そのものができません。release, retainなどretainカウントを操作するようなメソッドはすべてSwiftから使えないようにされています。(基本的でなければUnmanaged型というのを使えば出来る場合もあるのですが、少しでも使い方を間違うと即メモリリークかクラッシュと言う`Unsafe`が付かないくせに超恐ろしい型なので、短い言葉で紹介するのはやめておきます。) ARCを使うとインスタンスがretainカウントを使って管理されているというのを忘れそうになってしまうのですが、循環参照が発生するとARCでは管理できなくなってしまい、メモリリークと言うことになります。そこらへんだけ注意して、Swiftでコードを書くときはretain, releaseは自分では書かない、と思ってください。