NSNotification
由于viewDidUnload
和dealloc()
无法使用,我应该在哪里删除Swift中的观察器?
Answers:
使用以下方法,其功能与相同dealloc
。
deinit {
// Release all resources
// perform the deinitialization
}
在取消释放类实例之前,将调用反初始化器。您使用deinit关键字编写反初始化器,类似于使用init关键字编写初始化器。反初始化器仅在类类型上可用。
deinit
将其推入ViewControllerB时,不会调用ViewControllerA的@Kampai方法。
deinit
仅当ViewControllerA不在导航控制器的堆栈中时,才会调用它。例如:切换到RootViewController的(如果RootViewController的不ViewControllerA)
deinit
。理想的通话地点func viewDidDisappear(_ animated: Bool)
从iOS 9(和OS X 10.11)开始,如果您不使用基于块的观察器,则无需自己删除观察器。该系统将为您执行此操作,因为它会在可能的情况下为观察者使用弱零引用。
并且,如果您使用的是基于块的观察者,请确保在闭包的捕获列表中使用弱捕获自身[weak self]
,并在方法中删除观察者deinit
。如果您不对自身使用弱引用,deinit
则将永远不会调用方法(因此移除了该观察者),因为Notification Center会无限期地对其进行强引用。
可以在OS X v10.11和iOS 9的Foundation Release Notes中找到更多信息。
如果观察者能够存储为弱归零引用,则底层存储会将观察者存储为弱归零引用,或者如果对象不能弱存储(即,它具有自定义的保留/释放机制会阻止运行时) (因为能够弱地存储对象),它将对象存储为非弱的清零参考。这意味着不需要观察者取消其释放方法的注册。
当不再使用时,通过-[NSNotificationCenter addObserverForName:object:queue:usingBlock]方法的基于块的观察者仍然需要取消注册,因为系统仍然对这些观察者有很强的引用。
delegate = nil
的dealloc()
方法。从现在开始运作是否一样?
您可以使用三种方法:
之后popViewController
,返回navigationController
或dismissViewControllerAnimated
:
deinit {
print("Remove NotificationCenter Deinit")
NSNotificationCenter.defaultCenter().removeObserver(self)
}
viewDidDisappear
,请先删除它,然后再删除它:
override func viewDidDisappear(animated: Bool) {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
viewWillDisappear
-在打开下一个视图之前:
override func viewWillDisappear(animated: Bool) {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
Swift 3.0语法:
NotificationCenter.default.removeObserver(self)
在Swift 4.2中,这是删除观察者的方法之一
deinit {
NotificationCenter.default.removeObserver(self, name: Notification.Name.Identifier, object: nil)
}
在viewDidLoad类中设置addObserver通知
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(didReceivedItemDetail), name: Notification.Name.Identifier, object: nil)
}
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,则前者将删除观察者。
dealloc
方法中手动删除观察者。
deinit {
NotificationCenter.default.removeObserver(self)
}
如果在其中添加观察者viewWillAppear()
并将其删除,也很好viewWillDisappear()
迅捷5
我有一个聊天应用程序,所以每当我从ChatLogViewController转到其他viewController然后又回来时,我的键盘通知都会有1个额外的Observer。为了消除这一点,我在更改viewController或从chatLogViewController中删除时删除了所有观察者。
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
NotificationCenter.default.removeObserver(self)
}