Swift Academy · レッスン

リソース解放のためのdefer

ファイルを確実に閉じ、リソースを解放します。

レッスン 3/413 ステップ

「リソース解放のためのdefer」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

後処理の問題

ファイル、ロック、接続などのリソースは解放する必要があります。経路によって解放を忘れると、リソースリークが発生します。

func work() {
    print("acquire resource")
    print("use resource")
    print("release resource")
}
work()

deferによる解放の保証

解放処理をdeferに記述すると、関数がどのように終了しても必ず実行されます。

func work() {
    print("acquire resource")
    defer { print("release resource") }
    print("use resource")
}
work()

ファイルハンドルのシミュレーション

ここでは、単純な構造体で開く処理と閉じる処理をモデル化します。deferによってcloseが必ず呼び出されます。

struct File {
    let name: String
    func close() { print("closed", name) }
}
func readFile() {
    let f = File(name: "data.txt")
    defer { f.close() }
    print("reading", f.name)
}
readFile()

ロックの取得と解放

ロックをモデル化します。ロックを取得したら、後処理として解放を登録することで、クリティカルセクションの終了時に必ずロックを解除します。

func critical() {
    print("lock acquired")
    defer { print("lock released") }
    print("critical section work")
}
critical()

セットアップの近くに置く後処理

後処理をセットアップの直後に置くと、両者の対応が明確になり、記述を忘れにくくなります。

func session() {
    print("connect")
    defer { print("disconnect") }
    print("send request")
    print("receive response")
}
session()

複数のリソース

複数のリソースを扱う場合は、それぞれのセットアップの直後に後処理を宣言します。LIFO順によって正しく閉じられます。

func transaction() {
    print("open connection")
    defer { print("close connection") }
    print("begin transaction")
    defer { print("commit transaction") }
    print("run query")
}
transaction()

カウンターのリセット

deferを使うと、スコープの終了時にフラグをリセットするなど、状態を元に戻せます。

func tracked() {
    var active = true
    defer { active = false; print("active reset to", active) }
    print("active is", active)
}
tracked()

重複の回避

deferを使わない場合は、すべての終了経路で後処理を繰り返し記述する必要があります。deferなら一度記述するだけで済みます。

func validate(_ ok: Bool) {
    print("start")
    defer { print("cleanup done once") }
    if !ok {
        print("invalid")
        return
    }
    print("valid")
}
validate(false)

計算した値を使う後処理

deferを使って、処理した項目数などの最終的な測定値を記録できます。

func batch() {
    var processed = 0
    defer { print("processed", processed, "items") }
    for _ in 1...3 { processed += 1 }
}
batch()

一時的な状態の復元

deferを使うと、設定を一時的に変更した後、確実に元へ戻せます。

func withVerbose() {
    var verbose = false
    verbose = true
    defer { verbose = false; print("verbose restored:", verbose) }
    print("verbose during work:", verbose)
}
withVerbose()

ベストプラクティス

解放が必要なものを取得したら、次の行でdeferを使って解放処理を登録します。

func handle() {
    print("acquire")
    defer { print("release") }
    print("process")
}
handle()

確認問題

deferによる後処理を確認します。

まとめ

リソースを取得したら、直後にdeferで解放処理を登録します。これにより、すべての終了経路で後処理が必ず実行され、セットアップの近くに後処理を置けるうえ、returnごとに後処理を重複して記述せずに済みます。

func work() {
    print("acquire")
    defer { print("release") }
    print("use")
}
work()
無料で開始

AI チューターと学ぶ Swift — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
122
レッスン
409

よくある質問

「リソース解放のためのdefer」レッスンは無料ですか?

はい。「リソース解放のためのdefer」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「リソース解放のためのdefer」で何を学びますか?

ファイルを確実に閉じ、リソースを解放します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「リソース解放のためのdefer」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. deferの仕組み
  2. 複数のdeferブロックの実行順序
  3. リソース解放のためのdefer
  4. エラーと早期リターンでのdefer
← Swift Academyに戻る