0Pricing
Swift Academy · Leçon

Supprimer les observateurs en toute sécurité

Évitez les fuites et les plantages causés par des observateurs obsolètes.

Supprimer les observateurs en toute sécurité est une leçon Swift Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. 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 4 leçons au total.

Supprimer les observateurs en toute sécurité

Les observateurs doivent être supprimés lorsqu'ils ne sont plus nécessaires. Un observateur résiduel peut se déclencher après la disparition de son propriétaire, ce qui provoque des erreurs ou, avec les anciennes API, des plantages.

Pourquoi la suppression est importante

Historiquement, les observateurs fondés sur un sélecteur devaient être supprimés dans deinit pour éviter d'envoyer un message à un objet désalloué.

import Foundation

class Watcher: NSObject {
    override init() { super.init() }
    deinit { NotificationCenter.default.removeObserver(self) }
}
print("Removes itself on deinit")

removeObserver(self)

L'appel à removeObserver(self) désinscrit en une seule fois toutes les observations effectuées par cet objet.

import Foundation

class VM: NSObject {
    func stop() { NotificationCenter.default.removeObserver(self) }
}
VM().stop()
print("Removed all observations for self")

Supprimer un nom précis

Vous pouvez supprimer une seule observation en transmettant le nom et l'objet, sans modifier les autres.

import Foundation

let center = NotificationCenter.default
let obj = NSObject()
let name = Notification.Name("ping")
center.removeObserver(obj, name: name, object: nil)
print("Removed a specific observation")

Observateurs fondés sur un token

La méthode addObserver fondée sur une fermeture renvoie un token opaque. Conservez-le, puis supprimez l'observateur avec ce token.

import Foundation

let center = NotificationCenter.default
let name = Notification.Name("ping")
let token = center.addObserver(forName: name, object: nil, queue: nil) { _ in }
center.removeObserver(token)
print("Removed via token")

Stocker le token

Stockez le token dans une propriété afin qu'il vive aussi longtemps que l'observation doit être active, puis supprimez-le lorsque vous avez terminé.

import Foundation

class Model {
    var token: NSObjectProtocol?
    func start() {
        token = NotificationCenter.default.addObserver(
            forName: Notification.Name("x"), object: nil, queue: nil) { _ in }
    }
    func stop() {
        if let t = token { NotificationCenter.default.removeObserver(t) }
    }
}
let m = Model(); m.start(); m.stop()
print("Lifecycle managed")

Nettoyage automatique avec deinit

Supprimez le token dans deinit afin que l'observation se termine lorsque le propriétaire est désalloué.

import Foundation

class Owner {
    var token: NSObjectProtocol?
    deinit { if let t = token { NotificationCenter.default.removeObserver(t) } }
}
print("Token removed on deinit")

Remarque sur la durée de vie moderne

Dans les environnements d'exécution récents, les observateurs ajoutés avec l'API fondée sur un bloc sont automatiquement supprimés lorsque le token est désalloué. Une suppression explicite reste toutefois le choix le plus sûr et le plus clair.

import Foundation

// Holding the token in a property controls its lifetime.
class C { var token: NSObjectProtocol? }
print("Token lifetime equals observation lifetime")

Éviter les cycles de rétention

Si un observateur sous forme de fermeture capture fortement self, utilisez [weak self] pour éviter un cycle de rétention qui empêcherait la désallocation.

import Foundation

class VM {
    var token: NSObjectProtocol?
    func start() {
        token = NotificationCenter.default.addObserver(
            forName: Notification.Name("x"), object: nil, queue: nil) { [weak self] _ in
            self?.handle()
        }
    }
    func handle() { print("handled") }
}
VM().start()

Une double suppression est sans danger

Supprimer un observateur qui n'existe déjà plus est sans conséquence ; un nettoyage préventif ne provoquera donc pas de plantage.

import Foundation

let center = NotificationCenter.default
let obj = NSObject()
center.removeObserver(obj)
center.removeObserver(obj) // no harm
print("Safe to remove twice")

Résumé des bonnes pratiques

Privilégiez les fermetures fondées sur un token, stockez le token, supprimez-le dans deinit et capturez self faiblement. La durée de vie des observations reste ainsi correcte.

import Foundation

class Best {
    var token: NSObjectProtocol?
    deinit { token.map { NotificationCenter.default.removeObserver($0) } }
}
print("Followed best practices")

Vérification rapide

Comment supprimer un observateur sous forme de fermeture ajouté avec addObserver(forName:...) ?

Récapitulatif

Supprimez toujours les observateurs dont vous n'avez plus besoin. Utilisez removeObserver(self) pour les observateurs fondés sur un sélecteur et le token renvoyé pour les observateurs sous forme de fermeture ; stockez le token, nettoyez-le dans deinit et capturez self faiblement. Ensuite : comparaison du modèle observateur avec d'autres solutions.

Questions Fréquemment Posées

La leçon « Supprimer les observateurs en toute sécurité » est-elle gratuite ?

Oui — le texte complet de « Supprimer les observateurs en toute sécurité » 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 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Supprimer les observateurs en toute sécurité » ?

Évitez les fuites et les plantages causés par des observateurs obsolètes. 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 3 sur 4.

Combien de temps prend la leçon « Supprimer les observateurs en toute sécurité » ?

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. Publier et observer des notifications
  2. Charges utiles userInfo des notifications
  3. Supprimer les observateurs en toute sécurité
  4. Alternatives au modèle observateur
← Retour à Swift Academy