如果我希望它能在整个应用程序生命周期中存在,我是否需要手动删除观察者?

时间:2016-07-11 05:44:05

标签: ios nsnotificationcenter observers

我的NSNotification Observer不仅适用于某个视图或视图控制器。我希望仅在用户关闭应用时才删除它。我把"添加观察者"在AppDelegate中。我是否仍需要手动将其删除,或者在应用关闭时自动将其删除?

4 个答案:

答案 0 :(得分:3)

如果您需要某个视图控制器的通知,请将add observer添加到该特定类,并remove observer添加viewDidDisappear。 Ae看了你的情况,现在你在add observer中添加了app delegate,然后你可以根据你的要求在下面的方法中删除它。

- (void)applicationWillResignActive:(UIApplication *)application 
- (void)applicationDidEnterBackground:(UIApplication *)application
- (void)applicationWillTerminate:(UIApplication *)application

答案 1 :(得分:1)

当应用程序终止时,方法调用即

- (void)applicationWillTerminate:(UIApplication *)application
{
    // Called when the application is about to terminate. Save data if appropriate. 
}

你可以删除观察者:

或者你在这里删除观察者:

- (void)applicationDidEnterBackground:(UIApplication *)application
{

}

当应用程序进入后台时。

答案 2 :(得分:1)

我认为,您应该在

中编写代码
 deinit{
   //remove observer here
}

在Appdelegate类中添加以上方法。

希望这会对你有所帮助。感谢

答案 3 :(得分:1)

试试这个

你必须在didFinishLaunchingWithOptions

中添加addobserver
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(<#your selector#>)
                                                 name:@"TestNotification"
                                               object:nil];

    return YES;
}

然后删除applicationWillTerminate中的观察者。您不需要在其他方法中删除观察者,因为很多时候应用程序转到后台而不是一直调用didFinishLaunchingWithOptions。所以你必须只在applicationWillTerminate中删除。

- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.

    // If you don't remove yourself as an observer, the Notification Center
    // will continue to try and send notification objects to the deallocated
    // object.
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
希望它可以帮到你。