删除iOS 5 ARC中的NSNotificationCenter观察者

我有一个iOS 5基于ARC的项目,并且在我应该删除在UIViewController注册的NSNotificationCenter观察值的观察者方面遇到困难。 SO上的类似post曾经说过这应该在-dealloc方法中完成。 尽pipe这个方法在ARC项目中不是必需的,但我已经用下面的代码添加了它:

 - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } 

作为一个testing,我打开UIViewController (在UINavigationController ),做一些触发通知的事情,然后点击Backbutton将其popup堆栈。 然后,我重新打开UIViewController ,并做了更多的事情来触发通知,但注意到每个callback都被调用了两次 – 这表明以前的通知还没有被注销。 重复此过程只会导致每个callback被调用的次数超过了,所以它们似乎永远不会被注销。

任何帮助,将不胜感激!

这很清楚你的dealloc方法没有被调用(也不是removeObserver调用)。

为什么不在viewDidUnload:viewWillDisappear:方法中删除UIViewController的观察者?

如果你的dealloc没有被调用,很可能是因为有人仍然持有对视图控制器的引用。 也许你需要标记一些__weak ? 您可以使用分配工具来帮助追踪视图控制器的function。

“如果视图不在屏幕上,我还需要通知callback仍然被解雇” – >您可能需要注册UIApplicationWillEnterForegroundNotification。 如果是这样,让我们​​试试这个:

 - (void)viewWillAppear:(BOOL)animated { NSLog(@"viewWillAppear"); [super viewWillAppear:animated]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; } - (void)viewWillDisappear:(BOOL)animated { NSLog(@"viewWillDisappear"); [super viewWillDisappear:animated]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil]; } - (void)applicationWillEnterForeground:(UIApplication *)application { NSLog(@"applicationWillEnterForeground"); [[NSNotificationCenter defaultCenter] removeObserver:self]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; // do your stuff here } - (void)applicationDidEnterBackground:(UIApplication *)application { NSLog(@"applicationDidEnterBackground"); [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil]; } 

这个想法是添加或删除UIApplicationDidEnterBackgroundNotification每当进出你的屏幕。 当应用程序进入后台时,我们只需注册UIApplicationWillEnterForegroundNotification,然后移除它。 注意,当viewWillDisappear时,我们只是删除UIApplicationDidEnterBackgroundNotification。

我的dealloc()不是以某种方式调用的,所以我find了这个方法,希望对你也有用。

请享用 :)