2015-03-19 53 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