2010-04-20 67 views
2

当我将观察者添加到默认通知中心时,我会在何处取消注册?什么是从通知中心取消注册观察员的好地方?

示例:我有一个UIView子类,它位于视图控制器内部。该子类是FooBarNotification的观察者。如果发布此通知,该视图将获得该通知。但是现在,视图控制器决定抛弃视图。视图本身的-dealloc方法是最好的地方吗?

有没有像内存管理规则的规则?例如:我必须注销一个注册它的观察者吗?即视图在它的init方法中注册自己,所以它应该在它的-dealloc方法中注销自己?

(不谈论推送通知,但NSNotificationCenter)

回答

3

唯一的规则是确保观察者的生活比的登记周期长的。

由于-addObserver:…-retain观察者,如果注册会超越观察者本身,你的程序会崩溃。

Apple没有指定任何规则来取消注册观察者。 -dealloc很好。只需使用常识。例如。如果该观察者在视图控制器丢弃之后可能仍然存在,那么您应该在该丢弃过程中取消注册,否则观察者可能会收到不需要的通知。

2

当然,它应该在dealloc中完成,但基本上当你不再需要通知。

一个可能的地方是覆盖willMoveToWindow:

- (void)willMoveToWindow:(UIWindow *)newWindow 
{ 
    if (window == nil) { 
     // view removed from a window -- remove notifications here 
    } 
    [super willMoveToWindow:newWindow]; 
} 
2

我通常添加我的观察员viewWillAppear中,并在viewWillDisappear,再把它们去掉:消息上的UIView并删除通知时,视图是从一个窗口中删除。

这工作,因为几乎总是我不想通知由一种观点认为,当前不是在前台(再住观察家我在协调注册)

0

的dealloc和viewDidUnload如果被拾起你已经在viewDidLoad中注册了通知。