我有一个表视图,其中包含数百个使用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 */
}
因此当你向下滚动表时,会被调用数百次。我不确定我所做的事情是否有效。是否有更好的方法来创建这些颜色,也许有一些可重用性?我应该在一些全局变量中缓存这些颜色吗?我做的很贵还是可以忽略不计?
答案 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。