Swift Academy · Lektion

Retain cycles og ophævelse med weak/unowned

Find retain cycles mellem objekter og closures, og ophæv dem sikkert ved hjælp af weak - og unowned -referencer.

Lektion 2 af 38 trin

Retain cycles og ophævelse med weak/unowned er en gratis Swift Academy-lektion på CoddyKit. Dette er lektion 2 af 3. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Swift Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Swift Academy-kurset indeholder 3 lektioner i alt.

Hvad er en fastholdelsescyklus?

En fastholdelsescyklus opstår, når objekter eller lukninger har strong-referencer til hinanden, så ARC aldrig når nul. Bryd cyklusser med weak eller unowned.

Objekt ↔ objekt-cyklus

To stærke referencer i begge retninger skaber en lækage: Ingen af objekterne kan falde til nul.

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)

Bryd cyklussen med weak

Gør den ene side weak (ofte bagreferencen, f.eks. delegaten eller ejeren), så ARC kan frigive 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 deinit

Lukningscyklus (strong self)

Lukninger fastholder som standard variabler med stærke referencer. Hvis objektet også ejer lukningen, danner det en cyklus.

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 strongly

Bryd cyklussen med capture-lister

Brug [weak self] (valgfrit) til sikker oprydning; brug kun [unowned self], hvis self med sikkerhed lever, når lukningen udfø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 cycle

Tjekliste

Tjekliste:

  • Referencer i begge retninger? Gør den ene side weak (f.eks. en delegat).
  • Gemmes lukninger på en type? Brug [weak self] og udpak værdien sikkert.
  • Brug kun [unowned self], når levetiden er garanteret; ellers kan det medføre et nedbrud.

weak kontra unowned i lukninger

Hurtigt tjek: Hvilken capture-liste er sikrest, når objektet kan blive frigivet?

Opsummering

Opsummering: Find cyklusser i objekter og lukninger. Bryd dem med weak eller unowned efter behov; foretræk weak, hvis du er i tvivl.

Gratis at komme i gang

Lær Swift med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
122
Lektioner
409

Ofte stillede spørgsmål

Er lektionen “Retain cycles og ophævelse med weak/unowned” gratis?

Ja — alle 3 lektioner i læringssporet Swift Academy, inklusive “Retain cycles og ophævelse med weak/unowned”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Swift Academy-kurset indeholder 3 lektioner i alt.

Hvad lærer jeg i “Retain cycles og ophævelse med weak/unowned”?

Find retain cycles mellem objekter og closures, og ophæv dem sikkert ved hjælp af weak - og unowned -referencer. Du øver dig i Swift Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Swift Academy?

Der kræves ingen tidligere erfaring. Swift Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 3.

Hvor lang tid tager lektionen “Retain cycles og ophævelse med weak/unowned”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Swift Academy-lektion?

Ja. Alle Swift Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Grundlæggende ARC: strong / weak / unowned
  2. Retain cycles og ophævelse med weak/unowned
  3. Værdityper for at reducere deling
← Tilbage til Swift Academy