【问题标题】:static BOOL in Objective CObjective C 中的静态 BOOL
【发布时间】:2009-04-01 21:45:06
【问题描述】:

在下面的代码中,我在 UIColor 上创建了一个类别来创建随机颜色。但是,从这段代码中,我会认为每次运行该方法时“if”条件都会为真,而不仅仅是第一次。

我认为我并没有真正正确理解静态变量。静态变量是否只设置一次,然后在第二次运行该方法时,该行就被忽略了? (所以在第一次运行后,seeded 将永远是 YES)?

@interface UIColor(Random)
+(UIColor *)randomColor
{
    static BOOL seeded = NO;
    if (!seeded) 
    {
        seeded = YES;
        srandom(time(NULL));
    }
    CGFloat red = (CGFloat)random()/(CGFloat)RAND_MAX;
    CGFloat green = (CGFloat)random()/(CGFloat)RAND_MAX;
    CGFloat blue = (CGFloat)random()/(CGFloat)RAND_MAX;
    return [UIColor colorWithRed:red green:green blue:blue alpha:1.0f];
}

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    静态变量只设置一次是正确的。

    代码

    static BOOL seeded = NO;
    

    等价于

    static BOOL seeded;
    seeded = NO;
    

    第二个将始终评估为 NO,而第一个将评估为 NO,直到设置不同。

    【讨论】:

      【解决方案2】:

      这里的static 表示seeded 的当前值不会从一个方法调用到下一个方法调用中丢失。声明行上的赋值只定义了seeded 的第一个值。

      是的,seeded 在第一次运行后将永远是 YES

      【讨论】:

        【解决方案3】:

        当控制离开函数范围时,静态变量保持其值。所以 seeded 将被设置为它最后拥有的任何值。在您的情况下,您使用 NO 初始化种子,然后将其设置为 YES。所以,要回答你的问题,是的:第一次调用此方法后,seeded 将始终为 YES。

        【讨论】:

        • 短语“超出范围”可能被改写为“当控制离开范围时”,因为该变量在函数范围之外不可用。
        【解决方案4】:

        正如其他人所说,静态局部变量在创建时被初始化为特定值,并保留该值直到更改。另一方面,静态全局变量意味着它在文件范围内是本地的——也就是说,在当前源文件之外无法访问。

        可以在http://en.wikipedia.org/wiki/Block_Started_by_Symbol 找到一些历史记录/低级详细信息

        【讨论】:

          【解决方案5】:

          静态变量不像您的 red、greenblue 变量在此示例中那样分配在堆栈上。他们:

          1. 在内存中分配到一个不可变的位置,
          2. 即使包含函数从未被调用也会消耗内存,
          3. 可能在多个线程中使用该函数时会导致问题 - 尽管您的示例出现竞争条件的可能性很小,并且
          4. 仅分配一次;我不记得它是在第一次调用函数时还是在加载代码时(我认为是后者)。

          可能可以帮助您将其想象为编译器将声明(带有赋值)移到函数/类范围之外,但访问仅限于函数内部。

          【讨论】:

            【解决方案6】:

            嘿,您可以根据需要多次更改静态变量的值。您的 if 语句只有一次为真的原因是因为您在同一语句中声明并分配了 no 。尝试将两者分开,以查看每次运行时的 if 语句是否为真

            【讨论】:

              猜你喜欢
              • 2012-04-09
              • 1970-01-01
              • 2012-07-05
              • 2010-11-16
              • 2020-03-13
              • 1970-01-01
              • 2010-10-31
              • 2010-12-21
              • 2011-02-03
              相关资源
              最近更新 更多