在我的应用程序中,我使用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;
}];
}
但是在此期间,当用户在其他地方导航时,视图可能已被卸载。
所以有几个问题:
当加载新视图并将其推送到后台时,视图会发生什么?我想它会在某些时候被垃圾收集,但我如何判断上述任何参考资料是否仍然可以安全访问,如果不是这样,会发生什么?
如果视图仍然存在,我如何判断它是否仍然是前景视图?
答案 0 :(得分:0)
因此,块创建对其闭包中引用的所有对象指针的强引用。因此,你的块会强制[self]留在内存中,直到块被破坏。如果这不是您想要的行为,您应该创建一个指向self的弱指针并在块内引用它:
__弱类型(自我)weakSelf = self;
所以有几个问题:
加载新视图并将其推送到视图时,视图会发生什么 的背景?我想它会在某些时候收集垃圾,但是 如何判断任何引用是否仍然可以安全访问 以上,如果不是会发生什么?
如果您的视图保留在视图层次结构中,它将保留在内存中。一旦没有对视图的更多引用,它将被解除分配。
如果您使用如上所述的弱指针,那么如果视图已被释放,则[weakSelf]将为nil
如果视图仍然存在,我该怎么判断它是否仍然存在 前景?
我不确定前景视图的含义,但是如果你想查看它是否仍然在视图层次结构中,那么你可以查看属性 - (UIView *)superview。如果superview是nil,那么它不在屏幕上
答案 1 :(得分:0)
viewDidAppear
和viewDidDisappear
方法了解您的viewcontroller是否可见。