Сбор мусора Monotouch не работает - ошибка? - PullRequest
1 голос
/ 13 марта 2011

У меня есть приложение, которое отображает бесконечное количество ViewControllers и анимирует каждый новый, после примерно 30 VC происходит сбой приложения из-за нехватки памяти.После дальнейших экспериментов я обнаружил, что деструктор в экземпляре ViewController никогда не вызывается.

~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() вручную для всех подпредставлений, удаление подпредставлений, отмена регистрации обработчиков событий ... кажется, что виртуальный канал не может освободить свою память.Есть ли способ, которым я могу отпустить его вручную?Или что-то еще мне не хватает?Очень расстроен, я приветствую любую помощь.

Ответы [ 2 ]

3 голосов
/ 14 марта 2011

Трудно сказать, что ваш код делает с этим фрагментом, но если ваш финализатор не вызывается из-за двух причин:

(a) Когда вы вызываете Dispose () вручную, это освобождает ресурсы, а затем вызывает GC.SupressFinalize (стандартный шаблон Dispose). Это предотвращает запуск финализаторов, включая ваш, поэтому вы никогда бы его не увидели.

(b) Если этого не произошло, даже если вы вынули свое распоряжение, это потому, что кто-то все еще ссылается на него.

Теперь, возможно, вам нужно не анимировать UIViewControllers, а вместо этого Views. То, что вы, похоже, делаете за спиной UIViewController, выглядит мерзко, и ваш код может быть просто понятнее, просто есть AnimatedUIViewController, который управляет несколькими представлениями.

0 голосов
/ 15 марта 2011

Попробуйте проверить, вызывается ли на ваших контроллерах метод DidReceiveMemoryWarning. Если да, вы должны освободить память на ваших представлениях, которые в данный момент не видны.

...