2

メソッドを使用して描画された何百ものカスタム描画された UITableViewCells を含むテーブルビューがありますdrawRect:。これらのセルはすべて同じ色スタイルを共有しています。したがって、それぞれdrawRect:で、次のようなことを行います。

-(void)drawRect:(CGRect)rect
{
    UIColor *bgColor = [UIColor colorWithWhite:0.9 alpha:1.0];
    UIColor *textColor = [UIColor colorWithWhite:0.98 alpha:1.0];
    UIColor *strokeColor = [UIColor colorWithWhite:0.6 alpha:1.0];
    /* use colors */
}

テーブルを下にスクロールしていくと、これが何百回も呼び出されます。私がやっていることが効率的かどうかはよくわかりません。これらの色を作成するより良い方法はありますか? これらの色をいくつかのグローバル変数にキャッシュする必要がありますか? 私がしていることは高価ですか、それとも取るに足らないことですか?

4

3 に答える 3

4

まず、Instruments でプロファイリングして、これらの呼び出しにかなりの時間が費やされているかどうかを確認する必要があります。この場合は、それらを静的変数にして、最初の使用時に初期化します。

-(void)drawRect:(CGRect)rect
{
    static UIColor *bgColor;
    static UIColor *textColor;
    static UIColor *strokeColor;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        bgColor = [UIColor colorWithWhite:0.9 alpha:1.0];
        textColor = [UIColor colorWithWhite:0.98 alpha:1.0];
        strokeColor = [UIColor colorWithWhite:0.6 alpha:1.0];
    });

    /* use colors */
}
于 2012-07-30T19:00:16.977 に答える
2

これらの色を作成するより良い方法はありますか?

MONSharedCellStuffセルは、セルを作成するコントローラーによって作成および設定できるオブジェクトを保持できます。インターフェースは次の形式を取る場合があります。

@interface MONSharedCellStuff : NSObject

@property (nonatomic, copy, readonly) UIColor * bgColor;
@property (nonatomic, copy, readonly) UIColor * textColor;
@property (nonatomic, copy, readonly) UIColor * strokeColor;

@end

このインスタンスを使用して、他の不変のもの (一般的な画像やフォント) を共有することもできます。

あるいは、初期化中にセル自体がこれらを作成して保持することもできます (ただし、適切な共有よりも多くの時間とメモリが必要になります)。単純なケースでは問題ありません。

これほど多くのセルがあるため、セルを効率的に再利用することが重要です。

これらの色をいくつかのグローバル変数にキャッシュする必要がありますか?

繰り返しますが、セルを作成するコントローラーは、セルをキャッシュして作成するのに適した場所である可能性があります。

私がしていることは高価ですか、それとも取るに足らないことですか?

メモリおよび CPU プロファイラーを参照してください。

于 2012-07-30T20:21:31.320 に答える
0

この目的での UIColor カテゴリの使用に関するブログ投稿を書きました。

于 2013-07-10T09:18:36.867 に答える