以下代码来自Big Nerd Ranch iOS编程书第3版。它是一个类方法,用于检查单例类BNRItemStore是否已实例化。如果有,则返回单例实例,如果没有则创建它。我不理解的部分是静态变量。我知道静态变量保持状态,但是,不会再次调用该方法将* sharedStore重置为nil?即,这不是一个在重新调用该方法后会删除单例实例的创建的赋值吗?
static BNRItemStore *sharedStore = nil;
方法
+(BNRItemStore *)sharedStore
{
static BNRItemStore *sharedStore = nil;
if (!sharedStore)
sharedStore = [[ super allocWithZone:nil ] init ];
return sharedStore;
}
答案 0 :(得分:2)
不幸的是,C术语确实令人困惑。 static
与单身人士无关,站着不动,没有改变,或类似的事情。它与存储的级别有关。
在方法/函数内声明的变量通常是自动变量,这意味着当范围结束时(即执行到达周围花括号的末尾)它变得不存在。但是,声明为static的变量存储在保存代码的文件级别;加载文件后,即使在方法/函数中声明了该变量,该变量仍然存在。
现在我们来看看你如何知道这个变量是否曾被赋值,因为你只想分配一次。理论上,static
变量在最初声明时具有零值。因此,如果你只是说
static BNRItemStore *sharedStore;
...代码可能有效,因为对于一个实例,零是零,所以我们可以测试nil并仅在这种情况下分配一个值。但是,保证双重确定无害。因此,我们通常在声明它时将变量初始化为nil,这样我们就可以确保我们的nil测试将在第一次运行。
正如您已经被告知的那样,初始化程序将只生效一次,因为在此之后,值仍然存在,因此变量永远不需要再次初始化(并且永远不会)
答案 1 :(得分:1)
代码很好,初始化程序只在第一次调用。
答案 2 :(得分:0)
静态初始化程序由语言规范保证只执行一次(并且实际上是在应用程序启动时完成的,而不是作为函数执行的一部分)所以静态变量在函数第一次只有nil执行。