Retain cycles og hvordan de brytes med weak/unowned
Finn retain cycles mellom objekter og closures, og bryt dem trygt ved hjelp av weak - og unowned -referanser.
Retain cycles og hvordan de brytes med weak/unowned er en gratis leksjon i Swift Academy på CoddyKit. Dette er leksjon 2 av 3. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Swift Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Swift Academy inneholder totalt 3 leksjoner.
Hva er en retain-syklus?
En retain-syklus oppstår når objekter (eller closures) har strong-referanser til hverandre, slik at ARC aldri når null. Bryt sykluser med weak eller unowned.
Objekt ↔ objektsyklus
To strong-referanser i begge retninger skaper en lekkasje: Ingen av objektene kan synke til null.
final class Owner {
var gadget: Gadget?
deinit { print("Owner deinit") }
}
final class Gadget {
var owner: Owner?
deinit { print("Gadget deinit") }
}
// Strong ⇄ strong (cycle)
var o: Owner? = Owner()
var g: Gadget? = Gadget()
o!.gadget = g
g!.owner = o
o = nil // no deinit
g = nil // still no deinit (leak)Bryt med weak
Gjør den ene siden weak (ofte bakreferansen, for eksempel delegate/owner) slik at ARC kan frigjøre begge.
final class Owner2 {
var gadget: Gadget2?
deinit { print("Owner2 deinit") }
}
final class Gadget2 {
weak var owner: Owner2? // weak breaks cycle; becomes nil automatically
deinit { print("Gadget2 deinit") }
}
var o2: Owner2? = Owner2()
var g2: Gadget2? = Gadget2()
o2!.gadget = g2
g2!.owner = o2
o2 = nil // Owner2 deinit
g2 = nil // Gadget2 deinitClosure-syklus (strong self)
Closures fanger variabler med strong-referanser som standard. Hvis objektet også eier closuren, danner dette en syklus.
final class TimerClient {
var tick: (() -> Void)?
deinit { print("TimerClient deinit") }
func start() {
// BAD: closure strongly captures self; self keeps tick strongly
tick = {
print("tick from", self) // strong capture of self
}
}
}
var c: TimerClient? = TimerClient()
c!.start()
c = nil // no deinit — closure holds self stronglyBryt med capture-lister
Bruk [weak self] (optional) for trygg opprydding; bruk [unowned self] bare hvis det er garantert at self lever når closuren kjøres.
final class TimerClient2 {
var tick: (() -> Void)?
deinit { print("TimerClient2 deinit") }
func start() {
// Use [weak self] when self can go away before tick runs
tick = { [weak self] in
guard let self = self else { return } // safe unwrap
print("tick from", self)
}
// Alternative when lifetime is guaranteed: [unowned self]
// tick = { [unowned self] in print("tick from", self) }
}
}
var c2: TimerClient2? = TimerClient2()
c2!.start()
c2 = nil // deinit now prints — no cycleSjekkliste
Sjekkliste:
- Referanser i begge retninger? Gjør den ene siden weak (for eksempel delegate).
- Closures lagret på en type? Bruk [weak self] og pakk ut på en trygg måte.
- Bruk [unowned self] bare når levetiden er garantert; ellers kan det føre til krasj.
Weak kontra unowned i closures
Hurtigsjekk: Hvilken capture-liste er tryggest når objektet kan bli frigjort?
Oppsummering
Oppsummering: Identifiser sykluser i objekter og closures. Bryt dem med weak eller unowned på riktig måte; foretrekk weak når De er usikker.
Lær deg Swift med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 122
- Leksjoner
- 409
Ofte stilte spørsmål
Er leksjonen «Retain cycles og hvordan de brytes med weak/unowned» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Swift Academy, inkludert «Retain cycles og hvordan de brytes med weak/unowned», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Swift Academy inneholder totalt 3 leksjoner.
Hva lærer jeg i «Retain cycles og hvordan de brytes med weak/unowned»?
Finn retain cycles mellom objekter og closures, og bryt dem trygt ved hjelp av weak - og unowned -referanser. Du øver på Swift Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Swift Academy?
Ingen tidligere erfaring er nødvendig. Swift Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 3.
Hvor lang tid tar leksjonen «Retain cycles og hvordan de brytes med weak/unowned»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Swift Academy-leksjonen?
Ja. Alle Swift Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Grunnleggende ARC: strong / weak / unowned
- Retain cycles og hvordan de brytes med weak/unowned
- Verdityper for å redusere deling