在Swift中删除NSNotification观察者的位置?
我应该在Swift中删除NSNotification
的观察者,因为viewDidUnload
和dealloc()
不可用?
使用下面的方法,其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方法,在类的实例被销毁之前被调用。
我也想指出你应该使用这个方法:
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,前者将删除观察者。