观察者永远不会从NSNotificationCenter中删除

时间:2013-08-23 11:52:45

标签: ios nsnotificationcenter

我正在添加一个视图控制器作为UIKeyboardWillShowNotification通知的观察者。

我在viewDidLoad

中有这段代码
[[NSNotificationCenter defaultCenter] addObserver:self
                                     selector:@selector(keyboardWillShow:)
                                         name:UIKeyboardWillShowNotification
                                       object:nil];

在我的dealloc

[[NSNotificationCenter defaultCenter] removeObserver:self];

即使在视图控制器关闭时调用dealloc,也不会删除观察者。因此,当我第二次打开它时,NSNotificationCenter将尝试通知已发布的旧对象,并且应用程序崩溃。

我在StackOverflow上看到了几个关于这个特殊问题的问题,但没有答案对我有用。

我已尝试删除viewWillDisappearviewDidDisappear中的观察者,但同样的问题也会发生。

我正在使用ARC。

4 个答案:

答案 0 :(得分:1)

您是否在viewWillDisappear

中尝试了这一段确切的代码
- (void)viewWillDisappear:(BOOL)animated 
{
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

根据你的解释,我认为问题不在于移除观察者。 尝试从另一个viewcontroller触发Observer。如果未触发,您将知道删除成功,并且在第二次添加观察者时会出现问题。

答案 1 :(得分:0)

也许请尝试指定之前设置的参数name,如下所示:

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];

答案 2 :(得分:0)

看起来观察者已多次设置。您的控制器是否继承了同样注册相同通知的类?这可能导致控制器实例多次注册为观察者。作为一种解决方法,请在您添加观察者的控制器类中尝试此操作

// Remove as observer first
[[NSNotificationCenter defaultCenter] removeObserver:self];
                                      name:UIKeyboardWillShowNotification
                                      object:nil];
// Then add
[[NSNotificationCenter defaultCenter] addObserver:self
                                      selector:@selector(keyboardWillShow:)
                                      name:UIKeyboardWillShowNotification
                                      object:nil];

这将确保观察者只被添加一次。

希望有所帮助!

答案 3 :(得分:0)

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"name" object:nil];

它适用于我