在Swift中删除NSNotification观察者的位置?

我应该在Swift中删除NSNotification的观察者,因为viewDidUnloaddealloc()不可用?

使用下面的方法,其function与dealloc相同。

 deinit { // Release all recoureces // perform the deinitialization } 

在解除分配类实例之前立即调用取消初始化程序。 你可以使用deinit关键字来编写deinitializers,类似于init关键字的初始化函数。 取消初始化器仅适用于类types。

迅速Deinitializer

iOS 9 (和OS X 10.11)开始,如果您不使用基于块的观察者,则不需要自己移除观察者

系统会为你做,因为它为观察者使用调零弱参考。

更多信息可以在OS X v10.11和iOS 9的Foundation Release Notes中find。

你可以使用三种方法:

1 – 在popViewController之后,返回navigationController或者dismissViewControllerAnimated

 deinit { print("Remove NotificationCenter Deinit") NSNotificationCenter.defaultCenter().removeObserver(self) } 

要么

2 – viewDidDisappear ,在它已经是下一个视图控制器后删除:

 override func viewDidDisappear(animated: Bool) { NSNotificationCenter.defaultCenter().removeObserver(self) } 

要么

3 – viewWillDisappear – 打开下一个视图之前:

 override func viewWillDisappear(animated: Bool) { NSNotificationCenter.defaultCenter().removeObserver(self) } 

Swift 3.0语法:

 NotificationCenter.default.removeObserver(self) 

Swift提供了一个deinit方法,在类的实例被销毁之前被调用。

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Deinitialization.html

我也想指出你应该使用这个方法:

 func addObserver(_ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name?, object anObject: Any?) 

代替

 func addObserver(forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol 

后者不会删除观察者(最近这个问题就跑了)。 如果您使用iOS9,前者将删除观察者。