关于ViewWillAppear和ViewWillDisapper的NSNotificationCenter
我有一个简单的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作为通知中心观察者。 当viewcontroller在屏幕上时,我只需要知道UIKeyboardWillHideNotification
,因此我正在考虑添加以下内容:
- (void) viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [[NSNotificationCenter defaultCenter] removeObserver:self]; }
这够了吗? 在viewController仍然在屏幕上时,是否有可能调用viewDidUnload
或dealloc
? 请注意,我正在使用非常基本的UINavigationController
来管理我的应用程序。
在viewWillAppear
注册通知并在viewWillAppear
取消注册它似乎是一个干净,对称的解决方案。
请注意,在dealloc
之前可以多次调用viewWillAppear
(例如,如果将另一个视图控制器推到VC上,或者如果在标签栏控制器之间切换。)如果在viewWillAppear
注册通知并仅在dealloc
取消注册,那么您将获得重复注册(比较iOS / iPhone用户关于重复的NSNotification观察的警告 ),并且对于单个通知事件多次调用已注册的选择器。
我实际上更喜欢基于块的观察者注册方法
addObserverForName:object:queue:usingBlock:
返回一个不透明的对象,用于再次移除观察者。 将此返回值存储到视图控制器的实例变量中有助于跟踪观察者是否已注册,因此有助于避免重复注册。
要回答您的直接问题,除非您直接将其视为不应该使用,否则在您的视图仍在屏幕上时将永远不会调用dealloc
。
只有当没有强指针指向你的viewController时才会调用dealloc。
正如Anoop Vaidya建议的那样,将removeObserver放在dealloc
是完全可行的,并确信当你的viewController在屏幕上时dealloc
不会被调用,如果它确实……那么你有比移除观察者更大的问题
编辑:由于我实际上还没有回复评论,当你的viewController在屏幕外时,它实际上是已取消分配。 然后在屏幕上回调它时重新实例化。
编辑:我错了