2009-07-22 9 views
0

私はUIScrollViewに大きなビューのリストを実装しました。私は、私のアプリの性質のため、テーブルビューを使用することはできません。removeFromSuperView/memory/dynamic viewの切り替え

私は基本的にUIScrollViewの中にあるビューコントローラそのものである 'ブロック'のコレクションを持っています。すべてが正常に機能していますが、非常に大きなページではメモリが問題になります。私は正常にサブビューの動的追加を実装している(彼らが画面に来るとき、彼らはレイアウトされ、親のビューに追加されます)。ブロック自体は一度にセットアップされ、作成されますが、実際のビュー、つまりblock.viewは画面に表示されるまで大きなコンテナに追加されません。これはうまくいきますが、オフスクリーンになったらメモリからビューを削除する方法が必要です。 removeFromSuperViewはそれらを消してしまいますが、メモリの使用量は減少しません。

FromSuperViewを即座に削除すると、addSubviewの後にブロックが表示されず、メモリが上がらない。ドローサイクルの後にFromSuperviewを削除すると、メモリが描画に上がり、ビューがもう表示されなくても元に戻りません。実際にビュー全体を解放するまでは、ビューがキャッシュされているようです。これは、たとえそれが作成されていたとしても、それを描く前にあまりメモリを使用していなかったので意味がありません。

他の多くの(レイアウトなどの)情報を保持している私のブロック(viewcontroller)に属しているため、ビューを解放できません。私はちょうどメモリを取り戻す必要があります。私は描画サイクルの前にメモリ内のビューを保持することは、メモリが上がる原因ではないので、私はそれを取り除く必要はありません知っている。

たとえば、addSubviewの代わりに保持すると、私のビューはまだ周囲にありますが、それほど多くのメモリは使用されません。

私がUIViewsは、それが表示されるまで、実際に自分自身のためにレイヤーを割り当てないことについてスマートであると考えてVC

答えて

0

上のメモリの警告を呼び出して試してみました。そのため、メモリ使用量がスーパービューに追加されるまで上がることはありません。

あなたがすべきことは、必要になるまでビューを作成せずに、スクロールビューから削除するとすぐにリリースすることです。これにより、レイヤーの割り当てが解除されます。

viewプロパティでアクセスするたびにビューを作成(再作成)するには、基本的にはloadViewを実装する必要があります。

関連する問題