调用NSNotificationCenter时出现问题

时间:2015-06-17 13:20:59

标签: ios objective-c nsnotificationcenter

我想通过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.
}

当我跑步时,我在控制台中得到这个:

Console output

为什么我的方法被调用了两次?

修改

当我在ViewController2.m中使用此代码时,它工作正常。但为什么?? **

   [[NSNotificationCenter defaultCenter] removeObserver:self name:@"getTheRequest" object:nil];

4 个答案:

答案 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];

只是删除现有的,如果有的话......