UIViewController何时应添加/删除NSNotificationCenter的观察者?

12

如果我在viewDidLoad中向[NSNotificationCenter defaultCenter]添加一个观察者,那么我是否应该在viewDidUnload中将其删除?

3个回答

11

如果你需要在初始化器中添加这些内容,你应该在dealloc方法中将其删除。理想情况下,你只在当前屏幕上或离开时关心这些通知。

viewDid[Appear|Disappear] 方法可能会在 UIViewController 的生命周期内被多次调用。在viewDidAppear方法中注册通知,而在viewDidDisappear中注销它。


viewDidUnload不被调用但dealloc被调用的情况有哪些? - morningstar
当控制器从导航栈中弹出时,例如。当低内存条件迫使视图被卸载,即使控制器仍然存在,viewDidUnload也只会被调用。 - BJ Homer
释放回调或其时机不可靠...这不是真的吗...? - Moonwalker
1
viewDidUnload在iOS 6.0中已被弃用。在低内存条件下,视图不再被清除,因此该方法永远不会被调用。在多个点添加删除观察者并不是干净的代码。请使用dealloc。 - Luke Mcneice
答案来自2011年。我已经编辑了答案以反映弃用。 - Jason
“应该只在当前屏幕上或不在屏幕上时关注这些通知”这句话似乎过于简单化了。在一个带有选项卡栏的应用程序中,即使用户已经切换到另一个选项卡,屏幕可能仍然对处理状态信息(响应通知)感兴趣。” - software evolved

8
你应该在dealloc方法中删除它。

-1

在我看来,viewDidUnload 是放置它的地方。

如果被调用的通知处理程序访问了视图控制器管理的任何视图,则这将是一个错误或会导致视图不必要地重新加载。如果您的视图没有显示,那么最可能的情况是视图控制器不需要获得通知。如果它确实需要,请在对其进行任何更改之前至少检查视图是否已加载。虽然视图尚未加载,但您可能仍然需要更新视图控制器的状态,例如更改或清除缓存值,但在其重新加载之前不要更新视图。

第二个问题,如果您在 viewDidUnload 中不删除观察者,并且 viewDidLoad 再次被调用会发生什么?您会再次调用 addObserver。这可能不会有什么影响,通知中心可以检测到重复添加操作。


1
如果你使用相同的通知(notification)两次调用addObserver,那么你将会得到两个回调。请注意,IIRC。 - Jason
1
viewDidUnload在iOS 6.0中已被弃用。在低内存条件下,视图不再被清除,因此该方法不会被调用。 - Luke Mcneice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接