2009-06-18 3 views
0

私は次の行に「static NSString * MyIdentifier = @ "MyIdentifier"; "メソッド内:cellForRowAtIndexPathObjective-cまたはiPhoneプログラミングで "MyIdentifier"とは何ですか?

この行は何をしますか? NSStringオブジェクトへのランダムなポインタを作成し、それに文字列を割り当てますか? なぜMyIdentifierと呼ばれているのですか、多くの例でこれを見てきました。

#import "AddToFavorites.h" 


@implementation AddToFavorites 

- (id)initWithStyle:(UITableViewStyle)style { 
    if (self = [super initWithStyle:style]) { 
    } 
    return self; 
} 


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 


- (NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section { 
    return 5; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView 
cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *MyIdentifier = @"MyIdentifier"; 

UITableViewCell *cell = [tableView 
dequeueReusableCellWithIdentifier:MyIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero 
reuseIdentifier:MyIdentifier] autorelease]; 
} 
// Configure the cell 

return cell; 
} 

@end 

もう1つの例ですが、これは別の文字列CellIdentifierを持っています。

- (UITableViewCell *)tableView:(UITableView *)tableView 
cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"TimeZoneCell"; 

UITableViewCell *cell = [tableView 
dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    cell = [self tableviewCellWithReuseIdentifier:CellIdentifier]; 
} 

[self configureCell:cell forIndexPath:indexPath]; 
return cell; 
} 

答えて

6

UITableViewsは自動的にセルを再利用してメモリに保存できます。これを利用するには、UITableViewが、既存のセル( "dequeueReusbaleCellWithIdentifier")を、それが見つからない場合に作成するのと同じ識別子でルックアップできるようにするための "再利用識別子"を指定する必要があります既存の細胞。

この行は、識別子のNSStringを保持するために静的変数(すべてのコードパスで共有され、一度だけ初期化されますが、このメソッドでのみアクセスできます)を作成します。私の推測では、ポインタを比較するのはすばやく簡単ですが、文字列の内容を比較するのに少し時間がかかりますが、毎回同じポインタが使用されるようにすることです。

1

上記のようなパフォーマンスのために、スペルミスをキャッチする際にコンパイラーの助けを借りることもできます。 @ "" - 文字列リテラルを使用する場合、あなたの識別子のチェックはありません。静的識別子のスペルが間違っていると、コンパイラはエラーを出します。また、codesenseは静的な識別子を自動補完します。

0

識別子は、さまざまな目的で複数のセルのコレクションを持つことができるキーまたはタグです。

これにより、時間とRAMのメモリが節約されます。

のは、あなたが連絡先、企業や友人の2種類で、連絡先リストアプリケーションを持っていたとしましょう。

これらを異なる方法で表示したい場合は、ピクチャ(友人写真)と名前が黒色のフォントと会社の名前だけの写真とアイコンの2種類のセルを設計することができます。ユーザーがアプリケーションを使用している場合は

、それは3人の友人と最初に「A-M」で始まる名前の4社を表示する必要がある場合がありますので、3個の友人細胞と4個の企業の細胞が必要です。これらを渡し、識別子 "friend"を持つすべてのフレンドセルと、識別子 "business"を持つすべてのフレンドセルにタグ付けします。後でビューの変更に、ちょうど「P-T」で始まる名前を望んでいる

、あなただけの7つの事業を持っているかもしれません。それは「ビジネス」の識別子で7個の細胞を要求し、それはあなたがすでにあなたはすでに「ビジネス」で作成した4個の細胞をタグ付け判明ので、理想的には、すでに作成した細胞を再使用することになり、それは単にそれらを再使用しています。あなたがすでに作成した残りの3つは間違ったタグを持っているので、それらを無視するか、削除しますか?3つの新しいビジネスタイプのセルを作成し、それらにタグ "ビジネス"を与えます。

このようにしてセルを再利用することで、メモリに保存することができます(各タイプのセルを一度に表示できるだけです)。パフォーマンス(スクロール中に新しいセルを割り当てたり初期化したりする必要はありません上下)。この選択コードを書いて物IDを与えるという追加のプログラマーの努力に対して、これを置き換えます。

Object-C型に基づいて自動的にタグ付けされたセルがある可能性がありますが、サブクラス化またはインターフェイスビルダーを使用してセルをレイアウトするのではなく、プログラムでセルの内容を作成した場合は機能しません。したがって、代わりに識別子のメカニズムを提供します。

テーブルに1つのタイプのセルしかない場合は、「Alice」と呼んで忘れてください。

関連する問題