Objective C中的静态BOOL

时间:2009-04-01 21:45:07

标签: objective-c

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

我认为我并没有真正理解静态变量。静态变量是否只设置一次,然后第二次运行该方法时,该行只是被忽略了? (第一次运行后种子会永远为是)?

@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];
}

6 个答案:

答案 0 :(得分:15)

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

代码

static BOOL seeded = NO;

等同于

static BOOL seeded;
seeded = NO;

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

答案 1 :(得分:4)

此处static表示从方法调用到下一个方法时,seeded的当前值不会丢失。声明行上的赋值仅定义seeded的第一个值。

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

答案 2 :(得分:2)

当控件离开函数范围时,静态变量会保持其值。所以种子将被设置为它最后的价值。在您的情况下,您使用NO初始化种子,然后将其设置为YES。所以,回答你的问题,是的:在第一次调用这个方法之后,种子总是为YES。

答案 3 :(得分:1)

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

可以在http://en.wikipedia.org/wiki/Block_Started_by_Symbol

找到一点历史/低级详细信息

答案 4 :(得分:1)

静态变量未在堆栈中分配,例如红色,绿色蓝色变量。它们:

  1. 在内存中分配在一个不可变的位置
  2. 即使从不调用包含函数,也要使用内存,
  3. 当函数在多个线程中使用时,会导致问题 - 尽管您的示例具有非常小的竞争条件的可能性,并且
  4. 仅分配一次;我不记得它是第一次调用函数时还是在代码加载时(后者,我认为)。
  5. 可能可以帮助您将其视为编译器将声明(带有赋值)移到函数/类范围之外,但访问仅限于函数内。

答案 5 :(得分:-1)

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