视图控制器没有删除通知中心观察者
View controller is not removing Notification Center observer
我有这个 viewDidLoad
代码:
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] removeObserver:self];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(messageReceived:)
name:@"messageReceived"
object:nil];
}
此视图控制器是 UITabBarController
之一。每次我转到它的选项卡时,都会调用 viewDidLoad
,但似乎 [[NSNotificationCenter defaultCenter] removeObserver:self];
什么都不做,每次调用该方法时都会注册 "messageReceived"。
此代码片段来自另一个 class 通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"messageReceived"
object:nil
userInfo:nil];
只被调用一次,但是,例如,如果我转到正在观察的视图控制器的选项卡 3 次并且 viewDidLoad
被调用 3 次,那么它的 messageReceived:
方法是也叫了3次...
我可能遗漏了什么?
您可能想要挂钩以下内容:
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(messageReceived:)
name:@"messageReceived"
object:nil];
}
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
当您点击标签栏时,会创建一个新的 UIViewController 实例,因此会调用 viewDidLoad
。当您从 viewDidLoad
中调用 removeObserver
方法时,您要求从观察者中删除新创建的视图控制器,此时观察者从未注册。
-viewWillDisappear
在视图控制器从视图层次结构中删除之前被调用,因此从该方法调用 removeObserver
应该可以解决问题。
祝你好运!
我认为你应该在 dealloc 方法中添加 "remove observer" 代码,当你的视图将被删除时,arc 将自动调用该代码,也用于后台处理你可以 post 来自应用程序委托方法的通知 'applicationWillEnterInBackground' 和其他方法..
我有这个 viewDidLoad
代码:
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] removeObserver:self];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(messageReceived:)
name:@"messageReceived"
object:nil];
}
此视图控制器是 UITabBarController
之一。每次我转到它的选项卡时,都会调用 viewDidLoad
,但似乎 [[NSNotificationCenter defaultCenter] removeObserver:self];
什么都不做,每次调用该方法时都会注册 "messageReceived"。
此代码片段来自另一个 class 通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"messageReceived"
object:nil
userInfo:nil];
只被调用一次,但是,例如,如果我转到正在观察的视图控制器的选项卡 3 次并且 viewDidLoad
被调用 3 次,那么它的 messageReceived:
方法是也叫了3次...
我可能遗漏了什么?
您可能想要挂钩以下内容:
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(messageReceived:)
name:@"messageReceived"
object:nil];
}
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
当您点击标签栏时,会创建一个新的 UIViewController 实例,因此会调用 viewDidLoad
。当您从 viewDidLoad
中调用 removeObserver
方法时,您要求从观察者中删除新创建的视图控制器,此时观察者从未注册。
-viewWillDisappear
在视图控制器从视图层次结构中删除之前被调用,因此从该方法调用 removeObserver
应该可以解决问题。
祝你好运!
我认为你应该在 dealloc 方法中添加 "remove observer" 代码,当你的视图将被删除时,arc 将自动调用该代码,也用于后台处理你可以 post 来自应用程序委托方法的通知 'applicationWillEnterInBackground' 和其他方法..