在下面的代码中,我在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];
}
答案 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)
正如其他人所说,静态局部变量在创建时被初始化为特定值,并保留该值直到更改。另一方面,静态全局变量意味着它是文件范围的本地 - 也就是说,在当前源文件之外是不可访问的。
找到一点历史/低级详细信息答案 4 :(得分:1)
静态变量未在堆栈中分配,例如红色,绿色和蓝色变量。它们:
可能可以帮助您将其视为编译器将声明(带有赋值)移到函数/类范围之外,但访问仅限于函数内。
答案 5 :(得分:-1)
嘿,您可以根据需要多次更改静态变量的值。 if语句只有一次为真的原因是因为你在同一个语句中声明并赋值为no。尝试将两者分开以在每次运行时看到if语句为真