Swift Academy · Oppitunti

defer resurssien vapauttamiseen

Sulje tiedostot ja vapauta resurssit luotettavasti.

Oppitunti 3/413 vaihetta

defer resurssien vapauttamiseen on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Swift Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Swift Academy-kurssilla on yhteensä 4 oppituntia.

Siivousongelma

Tiedostojen, lukkojen ja yhteyksien kaltaiset resurssit on vapautettava. Jos resurssin vapautus unohtuu jollakin suorituspolulla, seurauksena on vuoto.

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

defer takaa vapautuksen

Kun vapautus sijoitetaan defer-lohkoon, sen suorittaminen taataan funktion poistumistavasta riippumatta.

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

Tiedostokahvan simulointi

Tässä yksinkertainen struct mallintaa avaamista ja sulkemista. defer varmistaa, että close kutsutaan aina.

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

Lukon hankkiminen ja vapauttaminen

Mallintakaa lukko: hankkikaa se ja lykätkää sen vapautus deferillä, jotta kriittinen osio vapautetaan aina.

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

Siivous alustuksen vieressä

Kun siivous pidetään heti alustuksen jälkeen, niiden yhteys on ilmeinen ja siivouksen unohtaminen vaikeampaa.

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

Useita resursseja

Kun resursseja on useita, määritelkää jokaisen resurssin siivous heti sen alustuksen jälkeen. LIFO-järjestys sulkee resurssit oikein.

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

Laskurin nollaaminen

Defer voi palauttaa tilan ennalleen, esimerkiksi nollaamalla lipun näkyvyysalueen päättyessä.

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

Toiston välttäminen

Ilman defer-lohkoa joutuisitte toistamaan siivouksen jokaisella poistumispolulla. defer avulla kirjoitatte sen kerran.

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

Siivous lasketun arvon avulla

Defer voi kirjata lopullisen mittaustuloksen, kuten käsiteltyjen kohteiden määrän.

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

Väliaikaisen tilan palauttaminen

Käyttäkää deferiä asetuksen väliaikaiseen muuttamiseen ja sen luotettavaan palauttamiseen.

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

Hyvä käytäntö

Aina kun hankitte jotakin vapautettavaa, rekisteröikää vapautus defer-lohkolla heti seuraavalla rivillä.

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

Pikatarkistus

Testatkaa deferiä siivouksessa.

Kertaus

Rekisteröikää resurssin vapautus defer-lohkolla heti hankkimisen jälkeen. Siivous suoritetaan varmasti jokaisella poistumispolulla, purku pysyy alustuksen vieressä eikä siivousta tarvitse toistaa eri palautuspoluilla.

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

Opi Swift tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
122
Oppitunnit
409

Usein kysytyt kysymykset

Onko oppitunti ”defer resurssien vapauttamiseen” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Swift Academy-oppimispolun 3 oppituntia, myös oppitunnin “defer resurssien vapauttamiseen”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Swift Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”defer resurssien vapauttamiseen”?

Sulje tiedostot ja vapauta resurssit luotettavasti. Harjoittelet Swift Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Swift Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Swift Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”defer resurssien vapauttamiseen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Swift Academy-oppitunnilla?

Kyllä. Jokainen Swift Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. defer-rakenteen toiminta
  2. Useiden defer-lohkojen suoritusjärjestys
  3. defer resurssien vapauttamiseen
  4. defer virheiden ja aikaisten palautusten kanssa
← Takaisin: Swift Academy