2012-07-04 4 views
15

この質問は本当に基本的なものです。ビュー階層からUIViewを削除してUIViewを隠すことのパフォーマンスの違いは何ですか?UIViewのパフォーマンス:removeFromSuperview VS hide

私は、ビュー階層から不要なビューを削除する必要があると読んでいます。現在、UIButtonが表示されることがあります。いつUIButtonを隠すのですか?それをスーパービューから削除するにはどうしたらいいですか?

ビュー階層を変更するのは費用がかかりますか?

答えて

1

サブビューの表示と非表示を切り替える必要がある場合、最善の方法は間違いなく非表示にすることです。 UIButtonの場合、メモリの意味はそれほど大きくありません。 hiddenプロパティを切り替えるだけでコードが確実に簡単になります。

さらに、hiddenプロパティがアニメーション可能であるという利点があります。

+0

したがって、非表示のUIViewをレンダリングし、そのビューをビュー階層に持たないことの違いは何ですか?違いはありますか? – bas

+0

はい。削除されている場合は、基本的に最初から再作成しています。これはメモリ管理には良いかもしれませんが、パフォーマンスに悪影響を与える可能性があります。変更をアニメートできない場合はあまり意味がありません。 – Mundi

+0

あなたがビューへの参照を保持していれば、再作成する必要はありません。私は、ビュー階層を変更するオーバーヘッドに興味がありました。この変更が何を引き起こすのか。私はそれがUIKitがビュー階層の表現として管理しているツリー構造を基本的に変更すると考えています。それは正確だと思いますか? – bas

7

私はiOS6 iPad miniの実験を行っています。リッチコンテンツ(画像、ドロップシャドウ、グラデーションレイヤー、パターン化された背景画像、あなたが知っているデザイナーを含む)がたくさんある大きなスクロールビューを使用しました。私はそのview.hidden = YES≠[view removeFromSuperview]を見つけました。

私はもともと、「はい」に設定されているとビューがレンダリング/描画されないと考えていたため、多くの隠しビューを持つと効率に影響しません。しかし、実際の結果は です。1)ビッグスクロールビューのオフスクリーンビューを非表示に設定して(表示エリアに戻ったときに表示されていない場合)、スクロールはスムーズではありません。それが自然に減速しているとき、それは非常に不安定に見えます。 2)オフスクリーンビューをスクロールビューから削除しても(ただし、トラッキング配列でメモリ内に保持されているので、すぐに追加できるようになるとすぐにスクロールがスムーズになります)

+2

実際には、UIViewを「非表示」に設定するとレンダリングされずに保存され、パフォーマンスが向上するという事実が繰り返されます。確かに、俊敏さは、おそらくsetNeedsDisplayをsetNeedsLayout(後者についてはわからない)と一緒に強制して、スローダウンに寄与する「非表示」にすることです。テーブルビューの場合、それはおそらく悪い考えですが、他のビューよりもはるかに大きなビューでは、必要がないときに不必要に再描画をトリガーしないように非表示にすることをお勧めします。 – strange

関連する問題