4

シナリオ1:UIViewControllerの場合、(1)UIViewのivarを作成して、外部の1つまたは2つの関数で再度アクセスする方がよいloadViewでしょうか。または、(2)タグを付けてから、他の関数で再度アクセスするためにloadView使用する必要がありますか?- (UIView *)viewWithTag:(NSInteger)tagオプション1は、ポインタのサイズ、つまり32/64ビットでメモリを増やし、アクセサメソッドを作成し(宣言@property&と仮定@synthesize)、ivarを解放してにdealloc設定する必要があると推測しています...そのオプション2はメモリを節約し、セットアップコードは少なくなりますが、タグでビューを見つけるために処理時間と少し余分なコードが必要になります。私はこれについて正しいですか?nilviewDidUnload

このシナリオでは、ivarを使用するのが最適ですが、よくわかりません。

シナリオ2:5つのサブビューを持つUIViewのカスタムサブクラスはどうですか?一度にこのカスタムサブクラスのインスタンスがメモリに約30個あることを念頭に置いて(これらはtableViewCellsのサブビューになります)、サブビューに5つのivarを使用する必要がありますか、それともすべてにタグを付ける必要がありますか?

このシナリオでは、それらすべてにタグを付けることによって節約されたメモリは、でそれらを検索するという小さなパフォーマンスヒットの価値があると思います- (UIView *)viewWithTag:(NSInteger)tag

考え?

ありがとう!

マット

4

3 に答える 3

5

メモリ使用量の違いはごくわずかであることを考慮すると(これらのビューを100個持つ場合を除き、これらのビューの一部を再利用する方法を検討する必要があります)、コードをさらに増やす方法を検討する必要があります。読み取り可能で保守可能。個人的には、ivarを使用すると読みやすくなると思いますが、特定のケースではタグを使用すると読みやすくなる可能性もあります。

コードを書くときは、1年か2年後にコードを読む人のことを常に考えています。その人は私かもしれませんし、他の誰かかもしれませんが、どちらにしても、その人は読みやすいコードを高く評価するでしょう。少なくとも128MBのRAMを搭載したデバイスで1kのメモリを節約してくれたことに感謝する可能性は低くなります。

于 2010-09-27T01:37:27.093 に答える
5

しばらくの間、各ビューがCALayerによってサポートされていることを考慮してください。IIRC、ビューは約44バイト(およびfoo)、レイヤーは約44バイト(プレゼンテーションツリーとレンダリングツリーがあるため、3倍)、レンダリングを行うレイヤーはビットマップコンテキストによってサポートされます。

または、より簡単に比較するには、各ポインタが1ピクセルと同じ量のメモリを消費します。

タグは、自分の生活を楽にする場所でのみ使用します。

  • ペン先に似たようなビューがある場合はたくさんあります(ボタンの山、それぞれが異なる色を選択します)。たくさんのアウトレットを配線することもできますが、その場合、コードは少しの算術演算ではなく、たくさんのivarを処理する必要があります)。
  • 同様の機能を備えた多くのサブビュー(たとえば、スクロールビューの「ページ」、またはUITableViewのようなコンテナのセルのようなビュー)。それらを配列で追跡することはできましたが、今日は怠惰に感じています。
  • 余分な整数(ページ番号など)を格納するためのビューが必要なときはいつでも。他にもたくさんの方法があります(サブクラス化、「関連付けられたオブジェクト」、値の固定layer.style...)。これは通常、最初の2つの場所に関連しています。

また、任意のサブビュー、任意のサブビューのサブビュー[v viewWithTag:tag]を返す可能性があることを忘れないでvください...タグ1の「コンテンツビュー」とタグ2の「ツールバービュー」を持つクラスFooViewについて考えてみます。

FooView * f1 = ...;
FooView * f2 = ...;
[f1.contentView addSubview:f2];
NSLog(@"%@ %@", f1.toolbarView, f2.toolbarView);

何を印刷しますか?f2まあ、それらは両方とものツールバーである可能性があります!

はい、Appleは検索をより賢明にすることができます(最も深い一致が見つかるまで検索を続行するか、反復深化深さ優先検索を使用できます)が、ドキュメントがない限り、単純な深さ優先検索を実行したと思いますそうでなければ言う。

于 2010-09-27T01:54:27.060 に答える
4

あなたは間違った質問をしていると思います。

5つのポインタを格納するために必要なメモリ、またはを使用して5つのビューを検索するために必要な時間viewWithTag:は、物事の壮大なスキームでは無視できるように思われます。

コードの記述、理解、および保守が最も簡単になるソリューションを選択してください。

万が一、時間/メモリ使用量の実際のプロファイリングで、選択したソリューションに問題があることが示された場合は、他のオプションを検討してください。それ以外は時期尚早の最適化です。

于 2010-09-27T01:36:51.270 に答える