Как правильно изменить текущий UIViewController без утечки памяти в MonoTouch? - PullRequest
1 голос
/ 17 августа 2011

У меня есть базовый класс UINavigationController (код без xib), использующий шаблон синглтона со следующим кодом

[MonoTouch.Foundation.Register("NavController")]
public class NavController : UINavigationController
{
    public static NavController Instance = new NavController();


    public void ChangePage( UIViewController sender, UIViewController page, double duration )
    {
       this.PopViewControllerAnimated(true);
       this.PushViewController( page, false );
       //
       SetViewControllers( new UIViewController[]{ page }, false );
       if( sender != null )
       {
          sender.View.RemoveFromSuperview();
          sender = null;
       }
       GC.Collect();
    }
}

А также у меня есть 4 класса UIWebController с этой структурой

[Register("HomePage")]
public class AViewPage : UIViewController
{
    UIButton    btn = new UIButton( new RectangleF( 0,0, 100, 100) );
    UIImageView img = new UIImageView( new RectangleF( 100, 100, 200, 200 ); 
    //and a lot of other widgets

    public override void ViewDidLoad ()
    {
         base.ViewDidLoad ();       
         //
         btn.TouchUpInside += delegate{
             AnotherViewPage page = new AnotherViewPage();
             NavController.Instance.ChangePage( this, page,  1 );
         }
     //
     this.View.AddSubview( btn );
     this.View.AddSubview( img );       
    }

}

Моя проблема заключается в том, что с текущим кодом утечка памяти.Что я делаю неправильно?

  • Должен ли я переопределить Dispose (bool) и вручную удалить все в классах UIWebController?
  • У меня также есть много UIImages и UIImageViews на этих UIViewControllers, как это правильноутилизировать их?
  • У меня такое ощущение, что код функции ChangePage уродлив.Помогите мне с лучшим примером, пожалуйста.

Ответы [ 2 ]

3 голосов
/ 17 августа 2011

В бета-версии MonoTouch 4.1 ожидается исправление, временное решение проблемы:

Заменить эту строку:

      sender.View.RemoveFromSuperview();

С:

      var super = sender.View.Superview;
      sender.View.RemoveFromSuperview ();
      var scratch = super.Subviews;

Правильное исправление в следующем выпуске будет работать. Извиняюсь за это.

0 голосов
/ 17 августа 2011

Хорошо, глупый вопрос с самого начала.

Если вы столкнулись с той же проблемой, просто прочитайте немного о PushViewController, PopViewControllerAnimated, ViewDidAppear, ViewDidDisappear и ViewDidLoad.

...