Ios 使用NSNOTIONATION移除观察者。。。我做错了什么?
基本上,我有一个view1,它在某个时候调用view2(通过Ios 使用NSNOTIONATION移除观察者。。。我做错了什么?,ios,objective-c,nsnotification,Ios,Objective C,Nsnotification,基本上,我有一个view1,它在某个时候调用view2(通过presentModalViewController:animated:)。当按下view2中的某个ui按钮时,view2将调用view1中的通知方法,然后立即取消。通知方法会弹出一个警报 通知方法工作正常,并被适当地调用。问题是,每次创建view1时(一次只应存在一个view1),我可能会收到另一个NSNotification,因为如果我从view0(菜单)转到view1,然后来回几次,我会收到一系列相同的警报消息,一个接一个,从通知
presentModalViewController:animated:
)。当按下view2中的某个ui按钮时,view2将调用view1中的通知方法,然后立即取消。通知方法会弹出一个警报
通知方法工作正常,并被适当地调用。问题是,每次创建view1时(一次只应存在一个view1),我可能会收到另一个NSNotification
,因为如果我从view0(菜单)转到view1,然后来回几次,我会收到一系列相同的警报消息,一个接一个,从通知方法打开视图的次数与打开视图的次数相同1
这是我的代码,请告诉我我做错了什么:
视图1.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];
}
调用-dealloc
不会在视图控制器被解除后自动发生-视图控制器的生命周期中仍有一些“生命”。在该时间段内,视图控制器仍然订阅该通知
如果在-viewWillEnglish:
或-viewDidEnglish:
中删除观察者,这将产生更直接的效果:
- (void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:@"alert"
object:nil];
}
如果在视图中删除观察者将消失:
或视图消失:
,则不应将添加的观察者保留在视图加载
中
相反,将添加的观察者放在视图中将出现:
。您遇到的问题是,当任何视图显示在UIViewController
视图上时,将删除您的观察者,并且由于您在viewdiload
中添加了观察者(只会发生一次),它将丢失
请记住,当主视图不在前方时,这种方法适用于不希望观察的对象
还请记住,viewDidUnload
也已贬值。将removeObserver:
放在dealloc
中没有什么错。只是它没有被调用这一事实意味着view1在被解聘后不能正常释放。看起来有东西将指针固定在视图1上,请检查是否有保留周期
另外,您不应该在super上致电dealloc。首先,感谢您的回复。如果我使用您提供的代码,则不会调用我的通知方法!但当我把它放回dealloc时,通知方法又回来了。。。但还是有同样的问题:(这可能是因为在同一视图中使用presentModalViewController时调用ViewWillEnglish?我不确定问题出在哪里。此方法是从UIView
或UIViewController
实例中调用的?通知方法?它是从scre上显示的另一个UIViewController中调用的。)en by[自我呈现ModalViewController:view2动画:是]-view将消失:
是从UIViewController
子类中调用的还是在UIView
子类中调用的?您必须只覆盖-view将消失:
是从UIViewController
中调用的。还要确保添加要删除的通知的名称
和对象
根据观察,您问题中的代码不包括(这可以解释为什么它不工作)。不要仅在ARC模式下调用超级上的dealloc。
- (void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:@"alert"
object:nil];
}