Wo soll ich den Beobachter NSNotification
in Swift entfernen , da viewDidUnload
und dealloc()
nicht verfügbar sind?
ios
swift
nsnotifications
Clement Joseph
quelle
quelle
Antworten:
Verwenden Sie die folgende Methode, die genauso funktioniert wie
dealloc
.deinit { // Release all resources // perform the deinitialization }
Schneller Deinitializer
quelle
deinit
Methode für ViewControllerA wird nicht aufgerufen, wenn ViewControllerB gedrückt wird.deinit
for ViewControllerA wird nur aufgerufen, wenn es sich nicht im Stapel des Navigationscontrollers befindet. Zum Beispiel: Wechseln zu rootViewController (wenn rootViewController nicht ViewControllerA ist)deinit
. Idealer Ort zum Anrufen wärefunc viewDidDisappear(_ animated: Bool)
Ab iOS 9 (und OS X 10.11) müssen Sie Beobachter nicht mehr selbst entfernen , wenn Sie jedoch keine blockbasierten Beobachter verwenden. Das System erledigt dies für Sie, da es für Beobachter, wo dies möglich ist, auf Nullstellen schwache Referenzen verwendet.
Und wenn Sie blockbasierten Beobachter verwenden, stellen Sie sicher , dass Sie erfassen selbst schwach mit
[weak self]
in der Schließung der Aufnahmeliste und entfernen Beobachter indeinit
Verfahren. Wenn Sie keinen schwachen Verweis auf sich selbst verwenden, wird diedeinit
Methode (und damit das Entfernen dieses Beobachters) niemals aufgerufen, da das Notification Center auf unbestimmte Zeit einen starken Verweis darauf enthält.Weitere Informationen finden Sie in den Foundation Release Notes für OS X 10.11 und iOS 9 .
quelle
delegate = nil
indealloc()
Methode geschrieben. Funktioniert es ab jetzt genauso?Sie können drei Methoden verwenden:
nach
popViewController
, zurücknavigationController
oderdismissViewControllerAnimated
:deinit { print("Remove NotificationCenter Deinit") NSNotificationCenter.defaultCenter().removeObserver(self) }
viewDidDisappear
, entfernen, nachdem es bereits der nächste View Controller ist:override func viewDidDisappear(animated: Bool) { NSNotificationCenter.defaultCenter().removeObserver(self) }
viewWillDisappear
- bevor Sie die nächste Ansicht öffnen:override func viewWillDisappear(animated: Bool) { NSNotificationCenter.defaultCenter().removeObserver(self) }
Schnelle 3.0-Syntax:
NotificationCenter.default.removeObserver(self)
quelle
In Swift 4.2 können Sie auf diese Weise Beobachter entfernen
deinit { NotificationCenter.default.removeObserver(self, name: Notification.Name.Identifier, object: nil) }
Richten Sie die addObserver-Benachrichtigung in der viewDidLoad-Klasse ein
override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(didReceivedItemDetail), name: Notification.Name.Identifier, object: nil) }
quelle
Swift bietet eine Deinit-Methode, die für Instanzen von Klassen aufgerufen wird, bevor sie zerstört werden.
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Deinitialization.html
quelle
Ich möchte auch darauf hinweisen, dass Sie diese Methode verwenden sollten:
func addObserver(_ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name?, object anObject: Any?)
Anstatt
func addObserver(forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol
Letzterer wird den Beobachter nicht entfernen (ist kürzlich auf dieses Problem gestoßen). Ersteres entfernt den Beobachter, wenn Sie iOS9 verwenden.
quelle
dealloc
Methode nicht manuell entfernt haben .deinit { NotificationCenter.default.removeObserver(self) }
quelle
Es ist auch gut, wenn Sie Ihren Beobachter hinzufügen
viewWillAppear()
und entfernenviewWillDisappear()
quelle
Swift 5
Ich habe eine Chat-Anwendung. Wenn ich also von meinem ChatLogViewController zu einem anderen viewController wechsle und dann zurückkomme, habe ich 1 zusätzlichen Beobachter meiner Tastaturbenachrichtigung. Um dies zu entfernen, entferne ich alle Beobachter, wenn ich meinen viewController ändere oder aus meinem chatLogViewController verschwinde .
override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) NotificationCenter.default.removeObserver(self) }
quelle