在completionHandler块中检测视图是否仍然存在或处于活动状态

时间:2014-03-28 04:58:16

标签: ios objective-c

在我的应用程序中,我使用completionHandler块轮询Web服务以获取状态更新,并在回调执行时根据返回的结果更改当前视图。

- (void) tickTimer
{
   [MyWebService myWebMethod:param1 completionHandler:^(NSString *result) {
       // does view still exist?
       [self myUpdateMethod];
       // does property still exist?
       self.theResult = result;
       // does child view still exist?
       _txtUpdate.text = result;
   }];
}

但是在此期间,当用户在其他地方导航时,视图可能已被卸载。

所以有几个问题:

  1. 当加载新视图并将其推送到后台时,视图会发生什么?我想它会在某些时候被垃圾收集,但我如何判断上述任何参考资料是否仍然可以安全访问,如果不是这样,会发生什么?

  2. 如果视图仍然存在,我如何判断它是否仍然是前景视图?

2 个答案:

答案 0 :(得分:0)

因此,块创建对其闭包中引用的所有对象指针的强引用。因此,你的块会强制[self]留在内存中,直到块被破坏。如果这不是您想要的行为,您应该创建一个指向self的弱指针并在块内引用它:

__弱类型(自我)weakSelf = self;

  

所以有几个问题:

     

加载新视图并将其推送到视图时,视图会发生什么   的背景?我想它会在某些时候收集垃圾,但是   如何判断任何引用是否仍然可以安全访问   以上,如果不是会发生什么?

如果您的视图保留在视图层次结构中,它将保留在内存中。一旦没有对视图的更多引用,它将被解除分配。

如果您使用如上所述的弱指针,那么如果视图已被释放,则[weakSelf]将为nil

  

如果视图仍然存在,我该怎么判断它是否仍然存在   前景?

我不确定前景视图的含义,但是如果你想查看它是否仍然在视图层次结构中,那么你可以查看属性 - (UIView *)superview。如果superview是nil,那么它不在屏幕上

答案 1 :(得分:0)

  1. 如果你正确使用ARC,它将不允许你使用deallocated viewcontroller。
  2. 您可以使用viewDidAppearviewDidDisappear方法了解您的viewcontroller是否可见。