2011-01-13 14 views
20

私はこの質問を投稿する直前を含め、いくつかの機会に「静的」を読みました。 私はまだ「ああ」を探しています。なぜstaticキーワードがUITableViewCell識別子で使用されていますか?

私が見てきたすべてのコードの中で、UITableViewの静的なコンテキストでは、静的なコードがCell Identifiersに表示されます。最近のCellForRowAtIndexPathの例:

static NSString *defaultIndentifier = @"Managed Object Cell Identifier"; 

私の質問はなぜ「静的」なのでしょうか?

答えて

11

これは1回だけ作成されるようになっています。静的でない場合は、メッセージが送信されるたびに作成されます(たくさんあります)。

+0

「毎回作成する」とは、「一定のポインタをスタック変数にプッシュする」ことを意味しています。しかし、コンパイラが '@" Identifier "を定数にコンパイルしたので、' int i = 3; 'と同じくらい高価です。スタティックが実際に恩恵を受ける唯一の時間は、文字列が定数文字列を使用する代わりに実行時に構築される場合です。 –

+1

これはまだ利点です。メソッドが実行されるたびに2つのプロセッサー・サイクルが切り捨てられます(これは多くの場合があります)。 – ughoavgfhw

+0

@ughoavgfhwええ、それはあなたのバイナリをより大きくし、あなたのアプリがより多くのメモリを使用するようにしませんか? – ma11hew28

18

ここには本当のメリットはありません。この特定のビットのすべてのセルに同じ値が使用されることは、ほとんどの場合、読者にとってのヒントです。識別子自体は定数文字列であるため、不変のメモリチャンクにコンパイルされ、毎回同じポインタとして参照されます。 staticキーワードを削除しても、文字列の作成にかかるコストはかかりません。

+0

"識別子自体は定数文字列です" – Philip007

0

私の推測では、文字列をstaticとして宣言することによって、毎回同じポインタが使用されるようになる(つまり、静的に宣言された変数はヒープ上で一度だけ割り当てられるので、 )

[NSString -isEqualToString:]は、最初にポインタ比較を実行した後、フォールバックと文字比較を行うように実装されている可能性があります。これは、各繰り返しで数回のサイクルを省くことができます。

(a)テーブルセルの再配置は、通常は非常に小さなセルセットで動作し、最適化されており、(b)テーブルリフレッシュがバースト的であるため、あまり得意ではありません。ユーザーがスクロールするか、アプリケーションロジックがコンテンツを変更するまで再び発生しません。-reloadTableを100回1秒間呼び出すと、アプリケーションロジックに間違いがあります。

私は、静的なキーワードは、Appleが適切な文字列の比較を実行するのではなく、ポインタをハッシュしている可能性があるという珍しい慣習であると考えています。

関連する問題