リソース解放のためのdefer
ファイルを確実に閉じ、リソースを解放します。
「リソース解放のための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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- deferの仕組み
- 複数のdeferブロックの実行順序
- リソース解放のためのdefer
- エラーと早期リターンでのdefer