我想通过NSNotificationCenter
从另一个类调用一个方法。一切正常。
问题是我的方法被调用了两次。
ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(removeAllSubViews:) name:@"getTheRequest" object:nil];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)removeAllSubViews:(NSNotification *)notification
{
NSLog(@"%@",notification.object);
NSLog(@"Print");
}
ViewController2.m
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] postNotificationName:@"getTheRequest" object:@"mySite"];
// Do any additional setup after loading the view.
}
当我跑步时,我在控制台中得到这个:
为什么我的方法被调用了两次?
修改
当我在ViewController2.m中使用此代码时,它工作正常。但为什么?? **
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"getTheRequest" object:nil];
答案 0 :(得分:0)
在方法中使用后,你必须删除观察者。
- (void)removeAllSubViews:(NSNotification *)notification
{
[[NSNotificationCenter defaultCenter] removeObserver("getTheRequest")]
NSLog(@"%@",notification.object);
NSLog(@"Print");
}
答案 1 :(得分:0)
我之前在视图控制器中有一个保留周期时已经看过这个,所以每次创建一个这个视图控制器的实例时,它都会被添加为NSNotificationCenter
观察者,但由于当视图控制器被解除时保留循环,它从未实际从内存中释放/释放,因此从技术上讲,它仍然是一个观察者。
您可能想尝试将以下内容添加到视图控制器中:
- (void)dealloc {
NSLog(@"Dealloc called.");
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
如果视图控制器被解除,如果没有保留周期,并且如果有NSLog
将永远不会被调用 - 这表示存在更大的内存相关问题,则应将其视为观察者。你所看到的只是副作用。
答案 2 :(得分:0)
您可能会看到多次调用该方法,因为您多次注册观察者(例如,您之前已导航到该视图控制器),但未在适当的位置再次删除它。无论如何,viewDidLoad
很可能不是注册观察者的理想场所。执行此操作的常见位置是指定的初始值设定项,并在dealloc
中再次删除它。
作为旁注(并且没有看到足够的代码以获得非常明智的意见),您的用例("删除所有子视图")听起来并不像通知是一种好方法。你考虑过使用授权吗?
答案 3 :(得分:0)
可能会有双NSNotificationCenter
注册。
我认为你已宣布另一个:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(removeAllSubViews:) name:@"getTheRequest" object:nil];
某处......试图找到另一个......
只是一个提示,当你注册NSNoticationCenter
时,首先尝试删除观察者:
// removes the observer
[[NSNotificationCenter defaultCenter] removeObserver:YourObserver name:YourName object:YourObject];
followed by:
// register
[[NSNotificationCenter defaultCenter] addObserver:YourObserver selector:YourSelector name:YourName object:YourObject];
只是删除现有的,如果有的话......