2015-03-19 32 views
0

考虑我们有一个自定义的UIViewContoller。如何清理Xamarin.iOS中的UIViewController?

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

有些消息来源表示,不建议清理重写Dispose()方法,因为它只涉及托管对象生命周期。

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

如何处理它的权利?

回答

2

ViewDidDisappear()ViewWillDisappear()将不会被多次调用;至少不是没有对ViewDidAppear()ViewWillAppear()的平衡调用。如果您看到更多致电方法消失方法比出现方法,您的代码中有一个错误。如果你想确保,你的清理只发生一次(理智),但不是解决事情如此简单:

bool myCleanupIsDone = false; 

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

    myCleanupIsDone = true; 
    CleanUpWhateverNeedsToBeCleanedUp(); 
} 

你应该几乎never need to overrideDispose(),除非你正在处理非托管资源。 Xamarin.iOS在内部做了很多工作,但是对于你的代码,在你的情况下它是不相关的。

通常你会在ViewWillAppear()中创建你需要的对象并在消失方法中清理它们。这样你就不需要检查是否已经清理了一些东西。

0

ViewWillDisappearViewDidDisappear实际上可以在iPhone上进行多次调用,例如每当新控制器出现或推送时。但我认为它仍然是进行所有必要清理工作的合适地点。

一旦您的控制器第一次消失,Krumelur的建议将以您的UIWebView的空代表结束 - 如果用户回来,它可能会崩溃。

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

下面是一些代码,我在我的一个项目发现(好像我已经通过这个前;)):

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

      base.ViewDidDisappear(animated); 
} 
+0

什么时候调用取决于_what_的意图。如果控制器出现时某些东西被初始化,那么每次清理都是非常有意义的。 – Krumelur 2015-03-21 06:13:06

+0

当然,但您的示例只提出一次加载/初始化,所以它不会以这种方式工作。 – 2015-03-21 09:58:12