defer do zwalniania zasobów
Niezawodne zamykanie plików i zwalnianie zasobów.
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()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
- Jak działa defer
- Kolejność wielu bloków defer
- defer do zwalniania zasobów
- defer z błędami i wczesnymi zwrotami