为什么对于类方法中的局部静态变量,初始赋值为nil只发生一次?

cod*_*boy 3 cocoa objective-c

+ (NSArray *)motivations {
static NSArray *motivations = nil;
if (!motivations) {
    motivations = [[NSArray alloc] initWithObjects:@"Greed", @"Revenge", @"Bloodlust", @"Nihilism", @"Insanity", nil];
}
return motivations;
Run Code Online (Sandbox Code Playgroud)

}

上面的代码来自'在Mac上学习Cocoa'.该书指出,对nil的初始赋值仅在第一次调用该方法时发生?我的问题是如何/为什么是这样的?

pax*_*blo 6

因为静态只初始化一次.尽管变量在函数内部,但它的存储持续时间是整个程序的存储持续时间.它初始化一次,并在函数的调用之间保持其值.

您发布的代码在概念上完全相同:

NSArray *motivations = nil;
+ (NSArray *)motivations {
    if (!motivations) {
        motivations = [[NSArray alloc] initWithObjects:@"Greed", @"Revenge",
            @"Bloodlust", @"Nihilism", @"Insanity", nil];
    }
    return motivations;
}
Run Code Online (Sandbox Code Playgroud)

在存储持续时间方面(虽然不是范围,因为motivations现在可以从外部看到).你在这里什么是一种其初始化数组没有Singleton模式,然后填充它,一旦您使用此代码的第一次.

ISO C99标准(是的,我确实意识到这不是C,但概念是相同的)状态:

具有静态存储持续时间的所有对象应在程序启动之前初始化(设置为其初始值).