0Pricing
Swift Academy · Lezione

defer per la pulizia delle risorse

Chiudi i file e rilasci le risorse in modo affidabile.

defer per la pulizia delle risorse è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.

Il problema della pulizia

Le risorse come file, blocchi o connessioni devono essere rilasciate. Dimenticare di rilasciarle in uno dei possibili percorsi causa perdite di risorse.

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

defer garantisce il rilascio

Inserire il rilascio in un defer garantisce che venga eseguito indipendentemente dal modo in cui la funzione termina.

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

Simulare un handle di file

Qui una semplice struct modella l'apertura e la chiusura. Il defer garantisce che close venga sempre chiamato.

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()

Acquisizione e rilascio di un blocco

Modelli un blocco: lo acquisisca, poi rimandi il rilascio con defer, in modo che la sezione critica venga sempre sbloccata.

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

Pulizia accanto alla configurazione

Mantenere la pulizia subito dopo la configurazione rende evidente l'abbinamento e riduce il rischio di dimenticarlo.

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

Più risorse

Quando sono presenti diverse risorse, dichiari ogni operazione di pulizia subito dopo la relativa configurazione; l'ordine LIFO le chiude correttamente.

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

Reimpostazione del contatore

Un defer può ripristinare lo stato, ad esempio reimpostando un flag, quando termina un ambito.

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

Evitare la duplicazione

Senza defer dovrebbe ripetere la pulizia in ogni percorso di uscita. Con defer la scrive una sola volta.

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

Pulizia con un valore calcolato

Un defer può registrare una misurazione finale, ad esempio il numero di elementi elaborati.

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

Ripristino temporaneo dello stato

Utilizzi defer per modificare temporaneamente un'impostazione e poi ripristinarla in modo affidabile.

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

Buona pratica

Ogni volta che acquisisce qualcosa che deve essere rilasciato, registri il rilascio con defer nella riga immediatamente successiva.

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

Verifica rapida

Verifichi l'uso di defer per la pulizia.

Riepilogo

Registri il rilascio di una risorsa con defer subito dopo averla acquisita. La pulizia è garantita in ogni percorso di uscita, mantiene la pulizia accanto alla configurazione ed evita di duplicarla nei diversi percorsi di return.

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

Domande Frequenti

La lezione «defer per la pulizia delle risorse» è gratuita?

Sì — il testo completo di «defer per la pulizia delle risorse» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.

Cosa imparerò in «defer per la pulizia delle risorse»?

Chiudi i file e rilasci le risorse in modo affidabile. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Swift Academy?

Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «defer per la pulizia delle risorse»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Swift Academy?

Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Come funziona defer
  2. Ordine di esecuzione di più blocchi defer
  3. defer per la pulizia delle risorse
  4. defer con errori e ritorni anticipati
← Torna a Swift Academy