NSNotificationCenter相对于viewWillAppear中和ViewWillDis

2019-08-18 08:33发布

我有一个简单的viewController,我要听UIKeyboardWillHideNotification 。 因此,我有以下代码:

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillBeHidden)
                                                 name:UIKeyboardWillHideNotification object:nil];
}

- (void) keyboardWillBeHidden
{
    [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
}

我试图决定何时删除的viewController作为通知中心的观察员。 我只需要了解UIKeyboardWillHideNotification当视图控制器在屏幕上,所以我正在考虑加入以下内容:

- (void) viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

这是足够的? 是否有过一个机会viewDidUnloaddealloc将被调用,而的viewController仍然在屏幕上? 请注意,我用一个很基本UINavigationController我的应用程序的流量。

Answer 1:

注册通知viewWillAppear并注销其viewWillDisappear似乎是一个清洁,对称解决方案给我。

需要注意的是viewWillAppear可以多次调用之前dealloc (例如,如果另一个视图控制器推到你的VC,或者如果你的标签栏控制器之间进行切换。)如果注册在通知viewWillAppear ,只有在注销它dealloc那么你会得到重复注册(比较警告适用于iOS / iPhone用户关于重复NSNotification观察 ),注册选择是为单一的通知事件多次调用。

其实我更喜欢基于块的观察者配准方法

addObserverForName:object:queue:usingBlock:

它返回其用于再次除去观察者的不透明对象。 存储这个返回值到您的视图控制器的实例变量有助于跟踪如果观察者已经注册与否,因此有助于避免重复登记。



Answer 2:

要回答你直接问, dealloc将永远不会,而你的观点依然是在屏幕上,除非你直接调用它,你不应该叫。

当有剩余点到你的viewController没有很强的指针的dealloc才会被调用。

作为Anoop维迪表明,这是完全可行的投入removeObserver在dealloc ,并且相信dealloc不会被调用,而你的viewController在屏幕上,如果确实如此......好吧,你有不是删除一个观察者更大的问题

编辑:既然不能真正回复评论,你当你的viewController是关闭屏幕它实际上是释放。 这是当它被称为回屏幕,然后重新实例化。

编辑:我错了



文章来源: NSNotificationCenter with respect to ViewWillAppear and ViewWillDisapper