0Pricing
Swift Academy · Lezione

Cicli di mantenimento e interruzione con weak/unowned

Individui i cicli di mantenimento tra oggetti e closure, quindi li interrompa usando in sicurezza riferimenti weak e unowned .

Cicli di mantenimento e interruzione con weak/unowned è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 2 di 3. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 3 lezioni in totale.

Che cos'è un retain cycle?

Un retain cycle si verifica quando oggetti (o closure) mantengono riferimenti strong reciproci, impedendo ad ARC di raggiungere lo zero. Interrompa i cicli con weak o unowned.

Ciclo oggetto ↔ oggetto

Due riferimenti strong in entrambe le direzioni creano una perdita di memoria: nessuno dei due oggetti può raggiungere il valore zero.

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)

Interrompere con weak

Renda un lato weak (spesso il riferimento inverso, come delegate/owner) per consentire ad ARC di rilasciare entrambi gli oggetti.

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

Ciclo delle closure (self strong)

Le closure catturano le variabili in modo strong per impostazione predefinita. Se l'oggetto possiede anche la closure, si forma un ciclo.

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

Interrompere con le liste di cattura

Usi [weak self] (opzionale) per una pulizia sicura; usi [unowned self] solo se è garantito che self sia ancora in vita quando la closure viene eseguita.

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

Lista di controllo

Lista di controllo:

  • Ci sono riferimenti in entrambe le direzioni? Renda un lato weak (ad esempio, il delegate).
  • Le closure sono memorizzate in un tipo? Catturi [weak self] e lo estragga in modo sicuro.
  • Usi [unowned self] solo quando la durata di vita è garantita; in caso contrario può causare un arresto anomalo.

weak e unowned nelle closure

Verifica rapida: quale lista di cattura è più sicura quando l'oggetto potrebbe essere rilasciato?

Riepilogo

Riepilogo: identifichi i cicli in oggetti e closure. Li interrompa con weak o unowned in modo appropriato; in caso di dubbio, preferisca weak.

Domande Frequenti

La lezione «Cicli di mantenimento e interruzione con weak/unowned» è gratuita?

Sì — il testo completo di «Cicli di mantenimento e interruzione con weak/unowned» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 3 lezioni in totale.

Cosa imparerò in «Cicli di mantenimento e interruzione con weak/unowned»?

Individui i cicli di mantenimento tra oggetti e closure, quindi li interrompa usando in sicurezza riferimenti weak e unowned . Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Swift Academy?

Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 3.

Quanto tempo richiede la lezione «Cicli di mantenimento e interruzione con weak/unowned»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Swift Academy?

Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Basi di ARC: strong / weak / unowned
  2. Cicli di mantenimento e interruzione con weak/unowned
  3. Tipi valore per ridurre la condivisione
← Torna a Swift Academy