1

私は休閑コードMonoTouchでメモリリークのない現在のUIViewControllerを変更する適切な方法は何ですか?

[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(); 
    } 
} 

とシングルトンパターンを使用してベースUINavigationControllerクラス(XIB-少ないコード)を有し、また、私はこのような構造を持つ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の機能コードが醜いと感じています。より良い事例を教えてください。

答えて

-1

Ok、最初から愚かな質問。

同じ問題を実行する場合は、PushViewController、PopViewControllerAnimated、ViewDidAppear、ViewDidDisappear、およびViewDidLoadについて少し読んでください。

3

修正がMonoTouchで4.1ベータリリースに来て、一時的な回避策はこれです:

は、この行を置き換えますと

 sender.View.RemoveFromSuperview(); 

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

で正しい修正を次のリリースでうまくいくでしょう。それについての謝罪。

関連する問題