如何防止UIViewController弹出后调用通知观察器?

How to prevent notitifcation observer from being called after UIViewController is popped?

提问人:Rahul Vyas 提问时间:1/7/2021 最后编辑:Rahul Vyas 更新时间:1/8/2021 访问量:63

问:

我有 2 个 A 和 B。从 A、I、B 和 B 有 2 个。现在,当我弹出 B 并在此之后来到 A 时,如果 Network 关闭,则调用在 VC B 中编写的方法。我无法弄清楚,如果 B 已经来自它的方法是如何调用的?UIViewControllerpushedobserversreachabilitypoppednavigation stack

注意-

  1. 我在 VC A 中没有 VC B 的任何属性。 每当从 VC A 推送时,都会创建一个 VC B 的新实例。
  2. 我也知道我可以删除viewWillDisappear中的观察者,但我仍然想 知道为什么即使在弹出 VC B 后仍会调用观察者。
iOS Objective-C 内存管理 通知

评论

1赞 skaak 1/7/2021
这对 stackoverflow.com/questions/64581143/ 有帮助吗?
0赞 Rahul Vyas 1/8/2021
目前,我已经在使用“isMovingFromParentViewController”标志检查来删除观察者,但我的问题仍未解决。为什么即使在弹出视图控制器后仍调用观察者?
0赞 skaak 1/8/2021
当 VC 弹出时,您不应该再在任何地方强烈引用它。问题可能出在了那里,但在这种情况下,即使你有一个强大的引用,在删除观察者之后,也不应该再次调用它,所以某处的东西是不对的。也许您没有正确删除它?显示一些代码?
1赞 Rahul Vyas 1/8/2021
我现在已经删除了视图中的观察者将在isMovingFromParentViewController标志条件中消失,并且它正在工作。感谢您的帮助
1赞 skaak 1/8/2021
好的,太好了!!回答问题 - 在弹出 VC 后,如果您在某处对它有强烈的引用,它会一直存在,直到该引用超出范围。根据您创建和使用它的方式,很容易有一个强大的参考,放置的时间比需要的时间更长。但我不认为这是正在发生的事情,在你导航时会发生一些清理工作,所以 VC 无论如何都会留下来,直到所有 UI 的东西都完成,所以这样的事情很容易发生。因此,防止它的好方法是使用标志或在您不再想对它做出反应时将其删除。

答:

1赞 skaak 1/8/2021 #1

如果您使用一个标志,您可以在其他相关位置打开和关闭,例如,根据您呈现它的方式应用什么,怎么样?然后,您可以在观察者触发时标记您的操作。这是一个大纲。viewWillAppearviewWillDisappearisMovingFromParentViewController

@interface ViewController ()

@property (nonatomic) BOOL flag;

@end

@implementation ViewController

// Action triggered by observer
- ( void ) someAction
{
    if ( self.flag )
    {
        // do it
    }
}

// Switch on
- ( void ) viewWillAppear:( BOOL ) animated
{
    [super viewWillAppear:animated];
    self.flag = YES;
}

// Switch off
- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    self.flag = NO;
}

@end

这很简单。它易于维护和调试,如果您需要在某个阶段根据其他原因打开或关闭操作,也很容易适应。

PS:你真的需要显示一些代码......如果不提供任何代码,很难给出更具体的答案。