1

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

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

      return sharedStore;
 }

我理解他想要做什么——如果它存在则返回相同的实例,如果不存在则创建一个新实例。令我困扰的是这一行:

 static BNRItemStore *sharedStore = nil;

每次调用该方法时,此行不会将 sharedStore 重置为 nil 值吗?如果此行始终将其设置为 nil,我看不到该方法将如何返回先前存在的实例。

提前致谢。

4

2 回答 2

4

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

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

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

于 2012-08-25T04:33:47.047 回答
1

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

因为sharedStoreis static,它会= nil在第一次被调用时被初始化(位)。后续调用将跳过这些说明。

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

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

基本上,您可以将其视为全局变量,但只有+sharedStore.

于 2012-08-25T04:27:04.840 回答