34

Apple が最初の iPhone 用に を開発したUITableViewとき、スクロール時のパフォーマンスに問題がありました。その後、ある賢いエンジニアが、オブジェクトの割り当てには代償が伴うことが原因であることを発見し、セルを再利用する方法を思いつきました。

「オブジェクトの割り当てにはパフォーマンス コストがかかります。たとえば、ユーザーがテーブル ビューをスクロールするときなど、割り当てが短期間に繰り返し発生する必要がある場合は特にそうです。新しいセルを割り当てる代わりにセルを再利用すると、テーブル ビューのパフォーマンスが大幅に向上します。」

出典: iOS リファレンス ライブラリ

使用するセルを再利用するには:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

さて、私が疑問に思っているのは、実際にここで何が起こっているのでしょうか? その識別子を持つセルがあり、それを返すだけの場合、TableView を調べますか? そうですね、しかし、割り当てではなく参照を送信し、同じ識別子を持つ4つのセルがすべて表示されているとしましょう。割り当てずに 4 つのインスタンスに自分自身を増やすにはどうすればよいでしょうか?

私はカレンダータイプのコンポーネントを構築しており、すべてのセルが同じ構造でテキストのみが変更されているため、これを知りたいです。したがって、割り当ての代わりにセルを再利用できれば、パフォーマンスが向上する可能性があると思います。

私自身の理論では、4 つのセルを割り当てるというものです (単純に割り当てられているため)。セルが画面から消えると、TableView 再利用キューに入れられます。新しいセルが必要な場合、同じ識別子を持つセルが利用可能かどうかをキューで調べ、prepareForReuseそのセルでメソッドを呼び出し、キューから自身を削除します。

4

3 に答える 3

44

dequeueReusableCellWithIdentifier:cell再利用の準備ができているとマークされている場合にのみ a を返します。これが、ほとんどすべてのcellForRowAtIndexPath:メソッドで次のようなものが表示される理由です。



UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (nil == cell) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:CellIdentifier];
}

// Do something to cell

return cell;

tableview実際には、 (さらに 1 つまたは 2 つ)の可視部分を満たすのに十分な行が割り当てられます。オフスクリーンとしてcells scroll、それらは から削除され、 のtable準備完了としてマークされreuseます。「使用可能なセル」のキューが大きくdequeued cellなると、 を要求する行が使用する を取得し始めcellます。この時点で、もう割り当てる必要はありません。

于 2010-08-23T23:04:16.703 に答える
13

のコードは次のdeqeueueReusableCellsWithIdentifier:ようになります。

(ページスクロールビューのビュー/ページで同様のことを行う自分のプロジェクトの1つから取得)

- (UIView*) dequeueReusablePage
{
    UIView* page = [reusablePages_ anyObject];
    if (page != nil) {
        [[page retain] autorelease];
        [reusablePages_ removeObject: page];
    }
    return page;
}

したがってNSMutableSet、再利用可能なオブジェクトでシンプルに保ちます。

セルが画面外にスクロールして見えなくなった場合、セルはこのセットに入れられます。

したがって、空のセットから開始すると、実際に表示するデータが画面に表示されるよりも多くある場合にのみ、セットが大きくなります。

使用されたセルは、画面の上部からスクロールされ、セットに入れられ、画面の下部に表示されるセルに取り込まれます。

于 2010-08-23T23:15:16.797 に答える