Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用NSNOTIONATION移除观察者。。。我做错了什么?_Ios_Objective C_Nsnotification - Fatal编程技术网

Ios 使用NSNOTIONATION移除观察者。。。我做错了什么?

Ios 使用NSNOTIONATION移除观察者。。。我做错了什么?,ios,objective-c,nsnotification,Ios,Objective C,Nsnotification,基本上,我有一个view1,它在某个时候调用view2(通过presentModalViewController:animated:)。当按下view2中的某个ui按钮时,view2将调用view1中的通知方法,然后立即取消。通知方法会弹出一个警报 通知方法工作正常,并被适当地调用。问题是,每次创建view1时(一次只应存在一个view1),我可能会收到另一个NSNotification,因为如果我从view0(菜单)转到view1,然后来回几次,我会收到一系列相同的警报消息,一个接一个,从通知

基本上,我有一个view1,它在某个时候调用view2(通过
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];
}