对 Objective-C 单例示例的澄清



我刚刚开始使用Objective-C,我在创建单例时遇到了这个例子:

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

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

 static BNRItemStore *sharedStore = nil;

每次调用该方法时,此行不会将共享存储重置为 nil 值吗?如果此行始终将其设置为 nil,我看不出该方法如何能够返回以前存在的实例。

提前谢谢。

这是

Objective-C从标准C继承的元素。任何具有静态存储持续时间的变量(static 类型说明符显式声明(只初始化一次,c 标准说这发生在程序启动之前。

6.2.4 3( 标识符使用外部或内部链接声明的对象,或使用存储类说明符 static 声明的对象具有静态存储持续时间。它的生存期是程序的整个执行,其存储的值在程序启动之前只初始化一次。

请注意,它还提到,如果具有静态存储持续时间的变量是"指针类型",则它会自动设置为 NULL 指针(这就是 nil (,因此,如果需要,如果您认为声明的= nil部分提高了函数的可读性,则可以省略声明的部分。

每次调用该方法时,此行不会将共享存储重置为 nil 值吗?

因为sharedStorestatic的,所以它将在第一次被调用时被初始化(= nil位(。后续调用将跳过这些说明。

如果此行始终将其设置为 nil,我看不出该方法如何能够返回以前存在的实例。

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

基本上,您可以将其视为全局变量,但只有 +sharedStore 才能访问它。

最新更新