Swift Academy · Leçon

Cycles de rétention et rupture avec weak/unowned

Repérez les cycles de rétention entre les objets et les fermetures, puis rompez-les en utilisant des références weak et unowned en toute sécurité.

Leçon 2 sur 38 étapes

Cycles de rétention et rupture avec weak/unowned est une leçon Swift Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 3. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Swift Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Swift Academy comprend 3 leçons au total.

Qu’est-ce qu’un cycle de rétention ?

Un cycle de rétention se produit lorsque des objets (ou des fermetures) conservent des références fortes les uns envers les autres, de sorte qu’ARC n’atteint jamais zéro. Rompez les cycles avec des références faibles ou non possédées.

Cycle objet ↔ objet

Deux références fortes dans les deux sens créent une fuite : aucun des deux objets ne peut atteindre zéro.

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)

Rompre avec une référence faible

Rendez un côté faible (souvent la référence inverse, comme celle vers le délégué ou le propriétaire) pour permettre à ARC de libérer les deux objets.

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

Cycle de fermeture (self fort)

Les fermetures capturent les variables fortement par défaut. Si l’objet possède également la fermeture, cela forme un cycle.

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

Rompre avec des listes de capture

Utilisez [faible self] (facultatif) pour un nettoyage sûr ; utilisez [non possédée self] uniquement si vous garantissez que self sera encore vivant lors de l’exécution de la fermeture.

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

Liste de vérification

Liste de vérification :

  • Références dans les deux sens ? Rendez un côté faible (par exemple, le délégué).
  • Fermetures stockées sur un type ? Capturez [faible self] et décompressez la valeur en toute sécurité.
  • Utilisez [non possédée self] uniquement lorsque la durée de vie est garantie ; sinon, cela peut provoquer un plantage.

Références faibles ou non possédées dans les fermetures

Vérification rapide : quelle liste de capture est la plus sûre lorsque l’objet peut être libéré ?

Récapitulatif

Récapitulatif : identifiez les cycles dans les objets et les fermetures. Rompez-les avec des références faibles ou non possédées, selon le cas ; en cas de doute, préférez une référence faible.

Gratuit pour commencer

Apprends Swift avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
122
Leçons
409

Questions Fréquemment Posées

La leçon « Cycles de rétention et rupture avec weak/unowned » est-elle gratuite ?

Oui — le texte complet de « Cycles de rétention et rupture avec weak/unowned » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Swift Academy, passe à CoddyKit PRO. Le cours Swift Academy comprend 3 leçons au total.

Qu'est-ce que j'apprendrai dans « Cycles de rétention et rupture avec weak/unowned » ?

Repérez les cycles de rétention entre les objets et les fermetures, puis rompez-les en utilisant des références weak et unowned en toute sécurité. Tu pratiques Swift Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Swift Academy ?

Aucune expérience préalable n'est requise. Swift Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 3.

Combien de temps prend la leçon « Cycles de rétention et rupture avec weak/unowned » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Swift Academy ?

Oui. Chaque leçon Swift Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Notions de base d’ARC : strong, weak et unowned
  2. Cycles de rétention et rupture avec weak/unowned
  3. Types valeur pour réduire le partage
← Retour à Swift Academy