为 NSNotificationCenter = Swift deinit() 调用 .removeObserver 的正确位置?

Posted

技术标签:

【中文标题】为 NSNotificationCenter = Swift deinit() 调用 .removeObserver 的正确位置?【英文标题】:The right place to call .removeObserver for NSNotificationCenter = Swift deinit()? 【发布时间】:2014-07-31 21:47:12 【问题描述】:

我已经阅读了很多关于为 NSNotificationCenter 调用 .removeObserver 的正确位置的建议,因为 viewDidUnload 不是一个选项。

我只是想知道 Swift 中的新 deinit() 是否是一个不错的选择?

-尼克

【问题讨论】:

viewDidUnload 从来都不是一个选项。什么时候添加观察者? 也不确定。我的直觉说 viewDidLoad,但有些人似乎认为将 viewWillAppear 配对用于添加和 viewWillDisappear 用于删除。其他人则表示,dealloc 将是删除的好地方。我只是认为在类被杀死时删除 deinit() 可能是一个不错的选择。 【参考方案1】:

这实际上取决于您订阅 NSNotificationCenter 通知的类的角色。如果您订阅:

UIView

那么您应该在视图对用户不可见时立即取消订阅。在用户看不到视图时节省 CPU 周期和不消耗资源。

UIViewController

这里还取决于您为响应通知而将执行的操作类型。如果只是 UI 调整,您应该在视图控制器从屏幕上消失后立即取消订阅。

你的应用服务层

这里可以在 deinit() 中包含 .removeObserver。但是,即使在这里,我也倾向于建议您更明确地了解何时订阅和取消订阅 NSNotificationCenternotifications 并将它们放在服务的启动和停止方法中。

【讨论】:

谢谢基尼。这确实有帮助。我只是观察视图控制器中的文本字段,所以我猜 viewwillAppear 和 viewWillDisappear 方法无论如何都是正确的选择。干杯。【参考方案2】:

如果您之前在viewDidUnload/dealloc/deinit 中调用了removeObserver,那么从ios 9.0 和macOS 10.11 开始,您就不需要再调用它了:

如果您的应用面向 iOS 9.0 及更高版本或 macOS 10.11 及更高版本,则无需在其 dealloc 方法中取消注册观察者。

来源:https://developer.apple.com/documentation/foundation/notificationcenter/1413994-removeobserver

【讨论】:

以上是关于为 NSNotificationCenter = Swift deinit() 调用 .removeObserver 的正确位置?的主要内容,如果未能解决你的问题,请参考以下文章

NSNotificationCenter PasteboardChangedNotification 未触发

NSNotificationCenter 通知中心传值

NSNotificationCenter PasteboardChangedNotification未触发

NSNotificationCenter 观察者没有收到通知

在 NSNotificationCenter 的通知的 userInfo 中传递空的 NSIndexPath

NSNotificationCenter ,打印内存地址