1

鉴于 viewDidLoad 中的这段代码:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(keyboardWillShow:) name:
 UIKeyboardWillShowNotification object:nil];
[nc addObserver:self selector:@selector(keyboardWillHide:) name:
 UIKeyboardWillHideNotification object:nil];

当我卸载视图(或类似的东西)时,我问自己是否需要删除观察者。

它看起来有点像这个问题,但这个问题没有讨论自使用 ARC 以来是否不推荐使用 dealloc (编辑:请参阅接受答案中的评论)。

但是由于 ios 一直在更新,我不知道您是否仍然需要调用 dealloc,而且我从未见过一段代码如何执行此操作(即删除观察者),我们将不胜感激 :)

4

3 回答 3

3

是的你是。dealloc在您的视图控制器中覆盖,如下所示:

- (void)dealloc {
     [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
     [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}
于 2013-07-20T19:31:05.973 回答
2

一般来说,当不再需要观察者时,您应该从通知中心移除观察者——要么您不需要它继续观察,要么对象本身正在被释放。您不需要UIKeyboardWillHideNotification仅仅因为键盘消失就移除观察对象,但是如果您要摆脱对象本身,则确实需要移除它。

考虑一下如果你在观察者被释放之前没有移除它会发生什么:如果它一直在观察的通知发生了,通知中心会尝试向那个对象发送消息。这将导致崩溃或某些您不期望的行为,因为通知中心用于发送消息的指针不再指向应该观察通知的对象。

于 2013-07-20T19:32:46.493 回答
1

在不需要通知观察者的情况下取消注册总是好的。

由于您的观察者处理作为视觉元素的键盘,因此将其取消注册,即从 viewDidDisappear 上的观察者中删除,并让它在 viewWillAppear 中重新注册(我遵循的东西。)。

这是必需的,因为如果您将新的视图控制器推送到正在使用的视图控制器上,观察者仍将被注册并可能导致错误行为,有时,如果您的视图控制器被释放,通知仍然会有观察者注册并可能导致崩溃。Coz 通知中心 defaultCenter 是一个进程的单例实例,并且将在其生命周期内存在。

发布 iOS 6.0 你可以在 viewDidUnload 中调用它。但是已弃用的 iOS 6.0。

于 2013-07-20T19:38:05.800 回答