如何在Xamarin.iOS中清理UIViewController?

时间:2015-03-19 08:34:39

标签: ios uiviewcontroller xamarin.ios xamarin

考虑一下我们有一个自定义的UIViewContoller。

现在我们必须对UIViewController卸载进行一些清理。例如,如果我们在视图控制器中使用UIWebView作为子视图,建议将其委托设置为null并在卸载时调用StopLoading()方法。

有些消息称,建议不要清理覆盖Dispose()方法,因为它只涉及托管对象生命周期。

其他消息来源称,不建议将ViewDidDissappear()用于这些目的,因为它可以被调用两次。

如何处理它?<​​/ p>

3 个答案:

答案 0 :(得分:3)

ViewDidDisappear()ViewWillDisappear()不会被多次调用;至少没有平衡调用ViewDidAppear()ViewWillAppear()。如果您看到对消失方法的调用多于对出现方法的调用,则代码中存在错误。如果你想确定,你的清理只发生一次(为了理智),但解决方案并不像这样简单:

bool myCleanupIsDone = false;

public override void ViewDidDisappear()
{
  if(myCleanupIsDone)
  {
    return;
  }

  myCleanupIsDone = true;
  CleanUpWhateverNeedsToBeCleanedUp();
}

除非您正在处理非托管资源,否则您应该never need to override Dispose()。 Xamarin.iOS在内部做了很多,但对于你的代码和你的情况,它是不相关的。

通常,您将在ViewWillAppear()中创建所需对象,并在消失方法中对其进行清理。这样你就不需要检查是否已经清理了某些东西。

答案 1 :(得分:1)

实际上可以在iPhone上多次调用

ViewWillDisappearViewDidDisappear,例如每次呈现或推送新控制器时。但我认为它仍然是进行所有必要清理的正确场所。

一旦你的控制器第一次失踪,Krumelur的提议将以UIWebView的空委托结束 - 如果用户回来,它可能会崩溃。

因此,如果你想要清理的控制器被弹出或解散,而不是设置一个标志,如果是这样的话,你可以安全地完成所有的工作。

这是我在其中一个项目中找到的一些代码(似乎我之前已经通过了这个代码;)):

public override void ViewDidDisappear(bool animated)
{
          if ((NavigationController == null && IsMovingFromParentViewController) ||
              (ParentViewController != null && ParentViewController.IsBeingDismissed))
          {
              CleanUpAfterDisappearing();
          }

          base.ViewDidDisappear(animated);
}

答案 2 :(得分:0)

当操作系统通过覆盖自定义视图控制器中的DidReceiveMemoryWarning()方法指示您的应用程序执行此操作时,您可以只清理资源:http://iosapi.xamarin.com/index.aspx?link=M%3AMonoTouch.UIKit.UIViewController.DidReceiveMemoryWarning