Podstawy ARC: strong / weak / unowned
Poznajcie zliczanie referencji ARC oraz dowiedzcie się, kiedy używać strong , weak i unowned , aby unikać wycieków pamięci.
Podstawy ARC: strong / weak / unowned to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 1 z 3. 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 3 lekcji w sumie.
ARC w minutę
Swift używa ARC (Automatic Reference Counting). Każda referencja strong zwiększa licznik instancji klasy. Gdy spadnie on do zera, wykonywane jest deinit i pamięć zostaje zwolniona.
Domyślnie strong
Strong jest ustawieniem domyślnym. Gdy znika ostatnia referencja strong, wywoływane jest deinit.
final class Person {
let name: String
init(_ name: String) { self.name = name; print("init:", name) }
deinit { print("deinit:", name) }
}
var p: Person? = Person("Ada")
p = nil // ARC count -> 0, triggers deinitPrzykład cyklu
Dwukierunkowe referencje strong tworzą cykl retencji. ARC nie może ich zwolnić, co prowadzi do wycieku pamięci.
final class A {
var b: B?
deinit { print("A deinit") }
}
final class B {
var a: A?
deinit { print("B deinit") }
}
var a: A? = A()
var b: B? = B()
a?.b = b // strong
b?.a = a // strong
a = nil // no deinit (cycle)
b = nil // still no deinit (leak)Referencja weak
Należy oznaczyć jedną stronę jako weak, aby uniknąć cyklu. Referencje weak są opcjonalne i automatycznie przyjmują wartość nil, gdy obiekt zostaje zwolniony.
final class A2 {
weak var b: B2? // weak breaks the strong cycle
deinit { print("A2 deinit") }
}
final class B2 {
var a: A2?
deinit { print("B2 deinit") }
}
var a2: A2? = A2()
var b2: B2? = B2()
a2?.b = b2 // weak
b2?.a = a2 // strong
a2 = nil // A2 deinit runs
b2 = nil // B2 deinit runsReferencja unowned
Należy używać unowned, gdy obiekt, do którego prowadzi referencja, będzie żył dłużej niż ta referencja. Referencja jest nieopcjonalna i nie jest ustawiana na nil; uzyskanie do niej dostępu po zwolnieniu obiektu powoduje awarię — dlatego należy zagwarantować odpowiedni czas życia.
final class Customer {
let name: String
var card: CreditCard?
init(_ name: String) { self.name = name }
deinit { print("Customer deinit") }
}
final class CreditCard {
unowned let owner: Customer // never optional; owner must outlive card
init(owner: Customer) { self.owner = owner }
deinit { print("CreditCard deinit") }
}
var cust: Customer? = Customer("Lars")
cust!.card = CreditCard(owner: cust!)
cust = nil // deallocates both (no cycle)Wskazówki i wzorce
Wskazówki:
- Domyślnie należy używać strong.
- Cykle należy przerywać za pomocą weak (delegaty są zwykle weak).
- unowned należy stosować wyłącznie wtedy, gdy czas życia jest zagwarantowany (np. dziecko → rodzic).
- Klasy są typami referencyjnymi; struktury i wyliczenia nie wymagają reguł ARC.
weak czy unowned?
Szybkie sprawdzenie: Kiedy należy wybrać weak, a kiedy unowned?
Podsumowanie
Podsumowanie: ARC zwalnia obiekty, gdy nie pozostają żadne referencje strong. Cykli należy unikać za pomocą weak (opcjonalnego) lub unowned (przy zagwarantowanym czasie życia). Należy wybrać najmniej restrykcyjny bezpieczny sposób zarządzania własnością.
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 „Podstawy ARC: strong / weak / unowned” jest bezpłatna?
Tak — pełny tekst „Podstawy ARC: strong / weak / unowned” 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 3 lekcji w sumie.
Co nauczysz się w „Podstawy ARC: strong / weak / unowned”?
Poznajcie zliczanie referencji ARC oraz dowiedzcie się, kiedy używać strong , weak i unowned , aby unikać wycieków pamięci. Ć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 1 z 3.
Ile czasu zajmuje lekcja „Podstawy ARC: strong / weak / unowned”?
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
- Podstawy ARC: strong / weak / unowned
- Cykle retencji i ich przerywanie za pomocą weak/unowned
- Typy wartości ograniczające współdzielenie