[英]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上看到了关于这个特殊问题的几个问题,但没有答案对我有用。
我已经尝试在viewWillDisappear
和viewDidDisappear
删除观察者,但同样的问题发生了。
我正在使用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.