用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,检查保留周期。

另外,你不应该超级调用de​​alloc。