Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何防止弹出UIViewController后调用Notification observer?_Ios_Objective C_Memory Management_Notifications - Fatal编程技术网

Ios 如何防止弹出UIViewController后调用Notification observer?

Ios 如何防止弹出UIViewController后调用Notification observer?,ios,objective-c,memory-management,notifications,Ios,Objective C,Memory Management,Notifications,我有2个UIViewControllerA和B。从A开始,IpushB和B有2个观察者用于可达性。现在,当我弹出B,然后到达A,如果网络关闭,则调用用VC编写的方法B。我无法理解,如果B已经从导航堆栈中弹出,那么它的方法是如何调用的 注意- 我在VC A中没有VC B的任何属性。我总是 每当从VC a推送时,都会创建一个新的VC B实例 我也知道我可以删除视图中的观察者,但我仍然想删除 知道为什么在VC B弹出后仍调用observer 如果您使用在视图中打开的标志将出现,而在视图中关闭的标志将消

我有2个
UIViewController
A和B。从A开始,I
push
B和B有2个
观察者
用于
可达性
。现在,当我弹出B,然后到达A,如果网络关闭,则调用用VC编写的方法B。我无法理解,如果B已经从
导航堆栈
中弹出
,那么它的方法是如何调用的

注意-

  • 我在VC A中没有VC B的任何属性。我总是 每当从VC a推送时,都会创建一个新的VC B实例
  • 我也知道我可以删除视图中的观察者,但我仍然想删除 知道为什么在VC B弹出后仍调用observer

  • 如果您使用在
    视图中打开的标志将出现
    ,而在
    视图中关闭的标志将消失
    ,以及在其他相关位置,例如在
    中从父视图控制器移动
    或根据您的呈现方式应用的标志,情况如何。然后,您可以在观察者触发时标记您的操作。这是一个提纲

    @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:你真的需要展示一些代码。。。如果您不提供任何代码,就很难给出更具体的答案。

    这是否有帮助?目前我已经在使用“isMovingFromParentViewController”标志检查来删除观察者,但我的问题仍然没有解决。为什么在弹出viewcontroller之后还要调用观察者?当VC弹出时,你不应该再在任何地方对它有强烈的引用。问题可能存在,但在这种情况下,即使您有一个强引用,在删除观察器后,也不应该再次调用它,因此某些地方不正确。也许您没有正确地移除它?显示一些代码?我现在已经删除了视图中的观察者,它将在isMovingFromParentViewController标志条件中消失,并且它正在工作。谢谢你的帮助好的!!!回答这个问题——VC被弹出后,如果你在某个地方对它有强烈的引用,它会一直存在,直到引用超出范围。根据您创建和使用它的方式,很容易有一个强引用存在超过需要的时间。但我不认为这是正在发生的事情,当你导航时会有一些清理工作发生,所以VC会一直呆在那里,直到所有的UI工作完成,所以这样的事情很容易发生。所以防止它的好方法是使用标志,或者在您不想再对它做出反应时将其删除。