视图控制器未删除通知中心观察器

时间:2015-11-10 16:00:29

标签: ios uiviewcontroller uitabbarcontroller observer-pattern nsnotificationcenter

我有这个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"每次调用该方法时都会注册。

此另一个类的代码段通知:

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

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

我能错过什么?

2 个答案:

答案 0 :(得分:0)

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

-(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。当您从removeObserver内调用viewDidLoad方法时,您要求从观察者中删除新创建的视图控制器,此时此视图从未注册过。

在从视图层次结构中删除视图控制器之前调用

-viewWillDisappear,因此从该方法调用removeObserver应该可以解决问题。

祝你好运!

答案 1 :(得分:0)

我认为您应该在dealloc方法中添加“删除观察者”代码,当您的视图被删除时,它将被自动调用,用于后台处理,您可以发布来自app委托方法'applicationWillEnterInBackground'和其他方法的通知。