2012-08-25 38 views
1

我刚刚开始在Objective-C和我碰到这个例子来打造一个单身:澄清一个Objective-C的Singleton实例

+ (BNRItemStore *) sharedStore 
{ 
     static BNRItemStore *sharedStore = nil; 
     if (!sharedStore) 
      sharedStore = [[super allocWithZone:nil] init]; 

     return sharedStore; 
} 

我明白了什么是他想要做的事 - 这是如果它存在,则返回相同的实例,如果不存在,则创建一个新实例。让我困扰的是这行:

static BNRItemStore *sharedStore = nil; 

这会不会行重置sharedStore到零值,每次调用该方法?我没有看到的方法如何能够返回先前存在的情况下,如果该行一直将其设为零。

在此先感谢。

回答

4

这是Objective-C的从标准C.继承的任何变量与静态存储持续时间(其static类型说明符显式声明)仅初始化一次一个元件,及the c standard说,这种情况发生在节目开始之前。

6.2.4 3)对象,其识别符被声明与外部或内部的键,或者与存储类说明静态具有静态存储持续时间。其寿命是该程序的整个执行和其存储的值被初始化仅仅一次,编程启动之前。

注意,它也提到,如果与静态存储持续时间的变量是“指针类型”,那么它会自动设置为NULL指针(这是零是什么),所以如果你愿意,你可以省略声明的= nil一部分,如果你认为这会增加你函数的可读性。

+0

谢谢各位的全面的答案。了解。 – Jops

1

每次调用该方法时,此行是否不会将sharedStore重置为零值?

由于sharedStorestatic,它将被初始化(在= nil位)第一次被调用。随后的呼叫将跳过这些说明。

我不明白该方法是否能够返回先前存在的实例,如果此行始终将其设置为零。

因为它是static该方法退出后,变量及其值将保留在内存中。

基本上,你可以认为这是一个全局变量,但它只能访问+sharedStore

+0

谢谢回复@Justin。感谢您的提示。 – Jops

+0

@Ronixus竭诚为 – justin