繁体   English   中英

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

[英]Observer never gets removed from NSNotificationCenter

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

我在viewDidLoad有这个代码:

[[NSNotificationCenter defaultCenter] addObserver:self
                                     selector:@selector(keyboardWillShow:)
                                         name:UIKeyboardWillShowNotification
                                       object:nil];

在我的dealloc

[[NSNotificationCenter defaultCenter] removeObserver:self];

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

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

我已经尝试在viewWillDisappearviewDidDisappear删除观察者,但同样的问题发生了。

我正在使用ARC。

你有没有在viewWillDisappear尝试过这段精确的代码?

- (void)viewWillDisappear:(BOOL)animated 
{
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

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

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

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

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

// 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];

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

希望有所帮助!

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

它适用于我

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM