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

标签 objective-c cocoa

+ (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/

相关文章:

ios - NSJSONSerialization 输出数字为 float ?

ios - Objective C 将 NSString 放在 NSLog 中

objective-c - 我如何加入 NSSet 的元素来创建 NSString?

ios - 使用 AVAudio 播放器问题播放多于 1 首歌曲

json - Cocoa - 解析 JSON 字符串

objective-c - OSX - 使用多个表格 View - 如何检查单元格越界

iphone - glDrawElements 分配内存但不释放它

objective-c - NSOperation 和 ARC 中 NSManagedObjectContext 保存方法上的 EXC_BAD_ACCESS,为什么?

objective-c - 禁止撤消创建/删除 NSManagedObject

cocoa - 用于单元测试的外部数据文件