2011-06-29 1 views
0

私は非常に大きなUIScrollViewをwebviews/subviewsなどで使用していますので、動的にする必要があり、3つのコンテナビューがプリロードされています。これはシミュレータでは動作しますが、メモリが少ないデバイスではクラッシュします。 Iは追加だと再帰的方法inifinite UIScrollViewプレロード付き

private void destroyChildren(UIView view, int level) { 
     if (view.Subviews.Length > 0) { 
      foreach (UIView subview in view.Subviews) { 
       destroyChildren(subview, level++);   // recurse 
       subview.RemoveFromSuperview(); 
       if (subview is UIWebView) { 
        (subview as UIWebView).ShouldStartLoad -= webHandler; 
       } 
       if (subview is scrollViewer) { 
        (subview as scrollViewer).clicked -= viewClicked; 
       } 

       subview.BackgroundColor = UIColor.Cyan; // release bgImage? 
       subview.Dispose(); 
      } 
     } 
     else { 
      if (level> 0) {   // dont dispose root view 
        view.Dispose(); 
      } 
     } 

とdestroyChildren(MYVIEW、0)と呼ばれるを使用して、3つのマスタビューから除去します。 メモリ警告が表示されているページが10回ほど回転してもアプリケーションがクラッシュします。このコードは大丈夫ですか?私は代わりにいくつかの種類のviewcontrollerを使用する必要があります。

ありがとうございました!

答えて

1

私が知っていることから、あなたがsubview.Dispose()を呼び出すと、これは正解です。これはすぐにガベージコレクションされず、後で他のアプリの使用の後に収集されます。可能であれば、サブビューの内容をnullに設定し、Dispose()を呼び出すようにしてください。また、あなたのサブビュー/マスタービュー内にDidReceiveMemoryWarningメソッドを実装することを検討してください。私は4つのページでそれぞれ3つのスクロールビューを使用して同様のアプリを使用しており、問題なく動作します。

+0

FOREACHでは子をNULLに設定することはできません。私はDidReceiveMemoryWarningの紋章を書いたが、すべてがすでに処分されているので、救命艇に入るのはちょうどその時だった。 –

+0

FOREACHでは子をNULLに設定することはできません。子を通してRemoveFromSuperviewを呼び出す必要があります。 – Scarlaxx

関連する問題