Observer sicher entfernen
Vermeiden Sie Leaks und Abstürze durch veraltete Observer.
Observer sicher entfernen ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Beobachter sicher entfernen
Beobachter müssen entfernt werden, sobald sie nicht mehr benötigt werden. Ein verwaister Beobachter kann reagieren, nachdem sein Besitzer bereits freigegeben wurde, und dadurch Fehler oder bei älteren APIs Abstürze verursachen.
Warum das Entfernen wichtig ist
Beobachter auf Selector-Basis mussten früher in deinit entfernt werden, damit kein bereits freigegebenes Objekt mehr Nachrichten empfängt.
import Foundation
class Watcher: NSObject {
override init() { super.init() }
deinit { NotificationCenter.default.removeObserver(self) }
}
print("Removes itself on deinit")removeObserver(self)
Der Aufruf von removeObserver(self) hebt in einem einzigen Aufruf alle Beobachtungen auf, die von diesem Objekt eingerichtet wurden.
import Foundation
class VM: NSObject {
func stop() { NotificationCenter.default.removeObserver(self) }
}
VM().stop()
print("Removed all observations for self")Einen bestimmten Namen entfernen
Sie können nur eine einzelne Beobachtung entfernen, indem Sie den Namen und das Objekt übergeben, während die übrigen Beobachtungen bestehen bleiben.
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")Beobachter mit Token
addObserver auf Closure-Basis gibt ein opakes Token zurück. Bewahren Sie es auf und entfernen Sie den Beobachter mit diesem 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")Das Token speichern
Speichern Sie das Token in einer Property, damit es so lange erhalten bleibt, wie Sie die Beobachtung benötigen, und entfernen Sie es anschließend.
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")Automatische Bereinigung mit deinit
Entfernen Sie das Token in deinit, damit die Beobachtung endet, sobald der Besitzer freigegeben wird.
import Foundation
class Owner {
var token: NSObjectProtocol?
deinit { if let t = token { NotificationCenter.default.removeObserver(t) } }
}
print("Token removed on deinit")Hinweis zur Lebensdauer in modernen Versionen
In aktuellen Runtimes werden mit der Block-API hinzugefügte Beobachter automatisch entfernt, wenn das Token freigegeben wird. Eine ausdrückliche Entfernung ist dennoch die sichere und klare Vorgehensweise.
import Foundation
// Holding the token in a property controls its lifetime.
class C { var token: NSObjectProtocol? }
print("Token lifetime equals observation lifetime")Retain Cycles vermeiden
Wenn eine Beobachter-Closure self stark erfasst, verwenden Sie [weak self], um einen Retain Cycle zu vermeiden, der die Freigabe verhindert.
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()Doppeltes Entfernen ist sicher
Das Entfernen eines Beobachters, der bereits entfernt wurde, ist unproblematisch. Eine defensive Bereinigung verursacht daher keinen Absturz.
import Foundation
let center = NotificationCenter.default
let obj = NSObject()
center.removeObserver(obj)
center.removeObserver(obj) // no harm
print("Safe to remove twice")Zusammenfassung der Best Practices
Bevorzugen Sie Closures mit Token, speichern Sie das Token, entfernen Sie es in deinit und erfassen Sie self schwach. So bleiben die Lebensdauern der Beobachtungen korrekt.
import Foundation
class Best {
var token: NSObjectProtocol?
deinit { token.map { NotificationCenter.default.removeObserver($0) } }
}
print("Followed best practices")Kurze Überprüfung
Wie entfernen Sie einen Closure-basierten Beobachter, der mit addObserver(forName:...) hinzugefügt wurde?
Zusammenfassung
Entfernen Sie Beobachter immer, sobald Sie sie nicht mehr benötigen. Verwenden Sie removeObserver(self) für Selector-Beobachter und das zurückgegebene Token für Closure-Beobachter. Speichern Sie das Token, bereinigen Sie es in deinit und erfassen Sie self schwach. Als Nächstes: Wie sich das Beobachtermuster mit Alternativen vergleichen lässt.
Häufig gestellte Fragen
Ist die Lektion „Observer sicher entfernen“ kostenlos?
Ja — der vollständige Text von „Observer sicher entfernen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Observer sicher entfernen“?
Vermeiden Sie Leaks und Abstürze durch veraltete Observer. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Swift Academy zu starten?
Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Observer sicher entfernen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?
Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Benachrichtigungen senden und beobachten
- Notification-userInfo-Payloads
- Observer sicher entfernen
- Alternativen zum Observer-Pattern