用NSNotification removeObserver …我做错了什么?
基本上,我有一个view1,在某些时候,调用view2(通过presentModalViewController:animated:
。 当view2中的某个UIButton
被按下时,view2在view1中调用通知方法,之后立即被解除。 通知方法popup警报。
通知方法工作正常,并被适当调用。 问题是,每次创buildview1(一次只存在一个view1),我大概会得到另一个NSNotification
被创build,因为如果我从view0(菜单)到view1,然后来回几次,我得到一系列相同的警报消息,从通知方法一个接一个地多次打开view1。
这是我的代码,请告诉我我做错了什么:
View1.m
-(void) viewDidLoad { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showAlert:) name:@"alert" object:nil]; } -(void) showAlert:(NSNotification*)notification { // (I've also tried to swap the removeObserver method from dealloc // to here, but it still fails to remove the observer.) // < UIAlertView code to pop up a message here. > } -(void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [super dealloc]; }
View2.m
-(IBAction) buttonWasTapped { [[NSNotificationCenter defaultCenter] postNotificationName:@"alert" object:nil]; [self dismissModalViewControllerAnimated:YES]; } -(void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [super dealloc]; }
调用-dealloc
不会在视图控制器closures后自动发生 – 在视图控制器的生命周期中仍然会有一些“生命”。 在那段时间内,该视图控制器仍然订阅了该通知。
如果您在-viewWillDisappear:
或-viewDidDisappear:
删除观察者,则会产生更直接的效果:
- (void) viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [[NSNotificationCenter defaultCenter] removeObserver:self name:@"alert" object:nil]; }
如果您在viewWillDisappear:
或viewDidDisappear:
实现了Observer的移除,那么您不应该在viewDidLoad
添加观察者。
取而代之的是在viewWillAppear:
添加观察者。 你遇到的问题是,因为当任何视图显示在UIViewController
视图将删除您的观察员将发生,因为你添加观察员在viewDidLoad
这将只发生一次,它将会丢失。
请记住,这种方法适用于你不希望观察的对象,而你的主视图不在前面。
另请注意, viewDidUnload
也被折旧了。
把removeObserver:
放在dealloc
没有错。 事实上,这并不意味着view1在解散之后不能正确释放。 看起来有东西持有你的观点指针1,检查保留周期。
另外,你不应该超级调用dealloc。