视图控制器没有删除通知中心观察者

View controller is not removing Notification Center observer

我有这个 viewDidLoad 代码:

- (void)viewDidLoad
{
   [super viewDidLoad];

   [[NSNotificationCenter defaultCenter] removeObserver:self];

   [[NSNotificationCenter defaultCenter] addObserver:self
                                            selector:@selector(messageReceived:)
                                             name:@"messageReceived"
                                           object:nil];
}

此视图控制器是 UITabBarController 之一。每次我转到它的选项卡时,都会调用 viewDidLoad,但似乎 [[NSNotificationCenter defaultCenter] removeObserver:self]; 什么都不做,每次调用该方法时都会注册 "messageReceived"。

此代码片段来自另一个 class 通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"messageReceived"
                                                            object:nil
                                                          userInfo:nil];

只被调用一次,但是,例如,如果我转到正在观察的视图控制器的选项卡 3 次并且 viewDidLoad 被调用 3 次,那么它的 messageReceived: 方法是也叫了3次...

我可能遗漏了什么?

您可能想要挂钩以下内容:

-(void)viewWillAppear:(BOOL)animated
{
  [super viewWillAppear:animated];
  [[NSNotificationCenter defaultCenter] addObserver:self
                                            selector:@selector(messageReceived:)
                                             name:@"messageReceived"
                                           object:nil];
}

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

当您点击标签栏时,会创建一个新的 UIViewController 实例,因此会调用 viewDidLoad。当您从 viewDidLoad 中调用 removeObserver 方法时,您要求从观察者中删除新创建的视图控制器,此时观察者从未注册。

-viewWillDisappear 在视图控制器从视图层次结构中删除之前被调用,因此从该方法调用 removeObserver 应该可以解决问题。

祝你好运!

我认为你应该在 dealloc 方法中添加 "remove observer" 代码,当你的视图将被删除时,arc 将自动调用该代码,也用于后台处理你可以 post 来自应用程序委托方法的通知 'applicationWillEnterInBackground' 和其他方法..