1

我有两个视图,当您从一个切换到另一个时,它们会向即将加载的视图调用通知以刷新内容。奇怪的是,第一次加载视图时,它会调用一次,下一次调用两次,以此类推。我得出的结论是,这是因为每次加载视图时都会不断添加它们。由于 dealloc 永远不会被调用,它仍然存在并且现在会继续添加。

那么有没有办法在被添加来解决这个问题之前检查通知是否存在?

这是我的 viewDidLoad

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ReloadGridNotification:) name:@"ReloadOHGridView" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ReloadBadgeNotification:) name:@"reloadBadge" object:nil];

还有我的交易:

[[NSNotificationCenter defaultCenter] removeObserver:self];

谢谢!
库尔顿

编辑1:

我在 UINavigationController 中显示我的视图并在它们之间切换。这是我刷新不同视图的代码:

- (void)viewWillDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadBadge" object:self];
}
4

2 回答 2

2

每次调用 addObserver 时,通知中心都会在其内部结构中添加一个条目。这意味着每次您调用 viewDidLoad 时,通知中心都会再次调用您的观察者。

如果您的视图因任何原因被卸载然后重新加载,则 viewDidLoad 将再次被调用。在对象被销毁之前,您的 removeobserver 不会被调用,这可以解释为什么您的 removeobserver 不起作用。

您应该检查是否已经使用标志调用了 addObserver,或者在 viewDidUnload 方法中卸载视图时使用 removeObserver 手动删除观察者。

Edit1:或者,您可以在其他地方添加观察者,例如在 App Delegate 中吗?

于 2011-04-18T00:53:13.040 回答
0

当内存紧张时,操作系统会转储您的视图,但会首先调用viewDidUnload; 当它必须重新加载它们时,它会调用viewDidLoad. dealloc但是,只有在您的视图的所有引用都已释放时才会调用,这可能在您的应用退出之前不会发生。

结果,正如@futureelite7 所指出的,每次重新加载视图时,您都会添加一个新的观察者,但实际上永远不会删除它。

您需要做的就是确保添加viewDidLoad和删除观察者viewDidUnload不会出现多重通知问题。不需要旗帜或将观察者放在其他任何地方。

从您的评论看来,您可能已经尝试过了,但我建议您仔细阅读您的代码,并绝对确定您只是在 DidLoad 中添加它们,并且总是在 DidUnload 中删除它们。它就像一个又一个应用程序中的魅力。


编辑添加

因为您的视图不断被卸载,只有在您手动执行时才会发生这种情况大约。

于 2011-04-18T01:21:59.393 回答