我刚刚开始使用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 值吗?
因为sharedStore
是static
的,所以它将在第一次被调用时被初始化(= nil
位(。后续调用将跳过这些说明。
如果此行始终将其设置为 nil,我看不出该方法如何能够返回以前存在的实例。
因为它是变量static
的,并且在方法退出后其值将保留在内存中。
基本上,您可以将其视为全局变量,但只有 +sharedStore
才能访问它。