Swift Academy · Lekcja

defer do zwalniania zasobów

Niezawodne zamykanie plików i zwalnianie zasobów.

Lekcja 3 z 413 kroki

defer do zwalniania zasobów to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.

Problem ze sprzątaniem

Trzeba zwalniać zasoby, takie jak pliki, blokady czy połączenia. Pominięcie zwolnienia na którejś ze ścieżek prowadzi do wycieków.

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

defer gwarantuje zwolnienie

Umieszczenie zwolnienia w instrukcji defer gwarantuje jej wykonanie niezależnie od sposobu zakończenia funkcji.

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

Symulowanie uchwytu pliku

W tym przykładzie prosty typ struct modeluje operacje otwierania i zamykania. Instrukcja defer zapewnia, że close zawsze zostanie wywołane.

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

Nabywanie i zwalnianie blokady

Zamodelujcie blokadę: pobierzcie ją, a następnie użyjcie defer do odroczonego zwolnienia, aby sekcja krytyczna zawsze została odblokowana.

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

Sprzątanie obok konfiguracji

Umieszczenie sprzątania bezpośrednio po konfiguracji sprawia, że ich powiązanie jest oczywiste i trudne do przeoczenia.

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

Wiele zasobów

W przypadku kilku zasobów deklarujcie sprzątanie każdego z nich bezpośrednio po jego konfiguracji; kolejność LIFO zamknie je poprawnie.

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

Resetowanie licznika

Instrukcja defer może przywrócić stan, na przykład zresetować flagę po zakończeniu zakresu.

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

Unikanie powtórzeń

Bez defer trzeba byłoby powtarzać sprzątanie na każdej ścieżce wyjścia. defer pozwala zapisać je tylko raz.

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

Sprzątanie z obliczoną wartością

Instrukcja defer może zapisać końcowy pomiar, na przykład liczbę przetworzonych elementów.

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

Przywracanie stanu tymczasowego

Używajcie defer, aby niezawodnie tymczasowo zmienić ustawienie, a następnie je przywrócić.

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

Dobra praktyka

Za każdym razem, gdy pobieracie coś, co trzeba zwolnić, zarejestrujcie zwolnienie za pomocą defer w następnym wierszu.

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

Szybkie sprawdzenie

Sprawdźcie działanie defer podczas sprzątania.

Podsumowanie

Rejestrujcie zwolnienie zasobu za pomocą defer bezpośrednio po jego pobraniu. Sprzątanie zostanie wykonane na każdej ścieżce wyjścia, pozostaje obok konfiguracji i nie trzeba go powtarzać przy kolejnych instrukcjach return.

func work() {
    print("acquire")
    defer { print("release") }
    print("use")
}
work()
Bezpłatny start

Ucz się Swift dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
122
Lekcje
409

Często zadawane pytania

Czy lekcja „defer do zwalniania zasobów” jest bezpłatna?

Tak — pełny tekst „defer do zwalniania zasobów” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „defer do zwalniania zasobów”?

Niezawodne zamykanie plików i zwalnianie zasobów. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Swift Academy?

Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „defer do zwalniania zasobów”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?

Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Jak działa defer
  2. Kolejność wielu bloków defer
  3. defer do zwalniania zasobów
  4. defer z błędami i wczesnymi zwrotami
← Powrót do Swift Academy