创建许多UIColors的最佳实践?

时间:2012-07-30 18:48:09

标签: iphone objective-c ios memory-management

我有一个表视图,其中包含数百个使用drawRect:方法绘制的自定义绘制的UITableViewCells。这些单元格都具有相同的颜色样式。所以,在每个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 */
}

因此当你向下滚动表时,会被调用数百次。我不确定我所做的事情是否有效。是否有更好的方法来创建这些颜色,也许有一些可重用性?我应该在一些全局变量中缓存这些颜色吗?我做的很贵还是可以忽略不计?

3 个答案:

答案 0 :(得分: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 */
}

答案 1 :(得分: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分析器。

答案 2 :(得分:0)

我为此目的使用UIColor类别写了blog post