【问题标题】:Best practice for creating many UIColors?创建许多 UIColors 的最佳实践?
【发布时间】:2012-07-30 18:48:08
【问题描述】:

我有一个表格视图,其中包含数百个自定义绘制的 UITableViewCell,这些 UITableViewCell 是使用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 */
}

因此,当您向下滚动表格时,它会被调用数百次。不过,我不确定我正在做的事情是否有效。有没有更好的方法来创建这些颜色,也许有一些可重用性?我应该将这些颜色缓存在某个全局变量中吗?我正在做的事情是昂贵的还是微不足道的?

【问题讨论】:

    标签: iphone objective-c ios memory-management


    【解决方案1】:

    首先,您应该使用 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 */
    }
    

    【讨论】:

    • 即使我没有在这些电话上花费那么多时间,我不应该做你上面所做的吗?毫无疑问,无论如何它会更有效率,不是吗?
    • 如果它能让你的程序更快,那么你应该这样做。如果它对您的程序的性能没有显着改变,那么这只是一个品味问题。我可能会这样做,其他人可能不会。
    • 最终结果如何? UIColor 的初始化需要时间吗?
    • @Eric:您可能想向 mohabitar 询问结果。在这种情况下,您应该以“@mohabitar:”开始评论,以确保通知他。
    • @MartinR:感谢您的反馈。我不知道。
    【解决方案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 分析器。

    【讨论】:

      【解决方案3】:

      我写了一个 blog post 用于此目的使用 UIColor 类别。

      【讨论】:

        猜你喜欢
        • 2016-06-30
        • 1970-01-01
        • 2021-03-07
        • 2023-03-22
        • 1970-01-01
        • 2018-07-07
        • 1970-01-01
        • 1970-01-01
        • 2011-06-25
        相关资源
        最近更新 更多