2011-03-13 23 views
1

我有一個應用程序,在大約30個VC由於內存不足而崩潰之後,會爲每個新的ViewControllers和動畫顯示無限量的ViewControllers和動畫。經過進一步的實驗,我發現ViewController實例上的析構函數從未被調用過。Monotouch Garbage Collectiton Not Working - Bug?

~TargetPromptController(){ 
    Console.WriteLine("Destructor Called!"); 
} 

代碼過渡到新的VC:

public void PageFlipRight(UIViewController aController) { 

     aController.View.Frame = new System.Drawing.RectangleF(0, 0, 659, 630); 
     aController.ViewWillAppear(true); 
     if (activeRightController != null) activeRightController.ViewWillDisappear(true); 
     rightView.AddSubview(aController.View); 
     if (aController.View is BaseRightView) 
      ((BaseRightView)aController.View).SetLocation(new PointF(0, 0),       CurrentOrientation); 
     aController.ViewDidAppear(true); 

     UIView.BeginAnimations(null); 
     UIView.SetAnimationDuration(1.0); 
     UIView.SetAnimationTransition(UIViewAnimationTransition.CurlUp, rightView, true); 
     UIView.CommitAnimations(); 

     NSTimer.CreateScheduledTimer(new TimeSpan(0, 0, 0, 0, 500), 
      delegate { 
        if (activeRightController != null) { 
         activeRightController.View.RemoveFromSuperview(); 
         activeRightController.ViewDidDisappear(true); 
         activeRightController.Dispose(); 
        } 
        activeRightController = aController; 
        GC.Collect(); 
       }); 
} 

我已經嘗試了一切。手動調用GC.Collect(),在所有子視圖上手動調用Dispose(),刪除子視圖,取消註冊事件處理程序......沒有任何東西似乎讓VC發佈它的內存。有沒有辦法我可以手動發佈它?還是有什麼我失蹤?非常沮喪,我歡迎任何幫助。

+2

很難說一目瞭然,但事件(其中您的對象是***目標***是經典的原因 – 2011-03-13 20:07:22

+1

一個可能的解決方案是保存和重用先前丟棄的視圖控制器對象,類似於完成table view cells – hotpaw2 2011-03-13 20:11:06

+0

這不僅僅是一個可能的解決方案,它可能是更好的解決方案。有一個原因,UITableView不僅僅是alloc/dealloc單元,而是重用它們 - 後者效率更高。 – lxt 2011-03-13 21:14:46

回答

3

這是很難說你的代碼是與片段做,但如果你的終結不被稱爲是由於兩個原因:

(a)當你調用Dispose()手動,這釋放資源,然後調用GC.SupressFinalize(標準Dispose模式)。這可以防止終結者運行,包括你的終止者,所以你從來沒有見過它。 (b)如果即使取出Dispose也沒有發生這種情況,那是因爲有人仍然提到它。

現在,也許你需要的不是動畫UIViewControllers,而是視圖。你在UIViewController的後面看起來好像很糟糕,你的代碼可能會更清晰,只是有一個AnimatedUIViewController可以管理多個視圖。

0

嘗試檢查您是否在控制器上調用了DidReceiveMemoryWarning方法。如果是的話,你應該釋放一些目前不可見的視圖內存。