在MonoTouch中没有内存泄漏的情况下更改当前UIViewController的正确方法是什么?

时间:2011-08-17 06:25:34

标签: memory-leaks uiviewcontroller uinavigationcontroller xamarin.ios

我有一个基础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类上的所有内容吗?
  • 我在这个UIViewControllers上也有很多UIImages和UIImageViews,处理它们的正确方法是什么?
  • 我觉得ChangePage功能代码很难看。请帮我一个更好的例子。

2 个答案:

答案 0 :(得分:3)

MonoTouch 4.1测试版即将推出修复程序,暂时的解决方法是:

替换此行:

      sender.View.RemoveFromSuperview();

使用:

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

下一个版本中的正确修复工作正常。为此道歉。

答案 1 :(得分:-1)

好的,从一开始就是愚蠢的问题。

如果您遇到同样的问题,请阅读一些关于PushViewController,PopViewControllerAnimated,ViewDidAppear,ViewDidDisappear和ViewDidLoad的内容。