+ (NSArray *)motivations {
static NSArray *motivations = nil;
if (!motivations) {
motivations = [[NSArray alloc] initWithObjects:@"Greed", @"Revenge", @"Bloodlust", @"Nihilism", @"Insanity", nil];
}
return motivations;
以上代码来自“在 Mac 上学习 Cocoa”。书上说对 nil 的初始赋值只发生在第一次调用方法时?我的问题是如何/为什么会这样?
最佳答案
因为静态只初始化一次。尽管变量在函数内部,但它的存储持续时间是整个程序的持续时间。它被初始化一次并在函数调用之间保持其值。
您发布的代码在概念上与:
NSArray *motivations = nil;
+ (NSArray *)motivations {
if (!motivations) {
motivations = [[NSArray alloc] initWithObjects:@"Greed", @"Revenge",
@"Bloodlust", @"Nihilism", @"Insanity", nil];
}
return motivations;
}
就存储持续时间而言(虽然不是范围,因为 motivations
现在从外部可见)。您在这里拥有的是一种单例模式,它将数组初始化为空,然后在您第一次使用此代码时一次填充它。
ISO C99 标准(是的,我确实意识到这不是 C,但概念是相同的)指出:
All objects with static storage duration shall be initialized (set to their initial values) before program startup.
关于objective-c - 为什么对于类方法中的局部静态变量,对 nil 的初始赋值只发生一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4131465/