removeObserver()方法是否会删除所有观察者?

27

以下代码是否可以移除所有已经以名称添加到 NSNotificationCenter.defaultCenter 中的视图通知?

NotificationCenter.default.removeObserver(self)

如果我在同一个viewDidLoad()中有以下内容,它们是否会被上面的单行代码移除?

NotificationCenter.default.addObserver(self, selector: Selector(("method1")), name: UITextField.textDidChangeNotification, object: nil)

NotificationCenter.default.addObserver(self, selector: Selector(("method2")), name: UITextView.textDidChangeNotification, object: nil)
2个回答

45

是的,removeObserver(self) 的调用将删除使用 addObserver:selector:name:object: 并使用 self 作为观察者添加的所有观察者,无论您指定的通知名称、对象或选择器。

除了在对象的 deinit 方法中使用外,使用 removeObserver(self) 方法都是不明智的,因为某些系统类(或您定义的对象的子类)可能添加了您不知道的观察者。该方法调用是一个"灭地"调用,从对象中删除所有观察者。

相反,您应该调用 removeObserver:name:object: 并仅移除您添加的观察者。


如果我按名称删除它们,应该使用哪种方法来删除它们?我是通过viewDidLoad()加载的。我没有自动完成deinit。 - 4thSpace
在Swift语言参考iBook中搜索它(该书籍是免费的)。如果你在viewDidLoad方法中添加一个观察者(该方法仅在视图控制器创建时调用一次),那么你需要在deinit方法中添加平衡调用以移除观察者。你的deinit方法将在对象被释放之前被调用。 - Duncan C
1
我已经在我的UIViewController中添加了一个deinit。我该如何在模拟器中测试它?它不会在按下主页按钮或关闭应用程序时触发。 - 4thSpace

1

我已经更新了问题。尽管OP中的两个观察者具有两个不同的方法名称,但是这一行代码应该同时移除两个观察者,对吗? - 4thSpace
看我的回答。答案是肯定的,但不要使用它。 - Duncan C
你的回答含糊不清。是哪个“参数”? - 4thSpace
我没有提到任何参数。我的回答时间戳为2:56。 - Duncan C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接