我正在按照一个例子来了解单身人士,但我对代码感到困惑,特别是对静态变量的使用。以下是代码: 这是代码检查这是否是第一次初始化变量。
+ (instancetype)sharedStore
{
static BNRImageStore *sharedStore = nil;
if (!sharedStore) {
sharedStore = [[self alloc] initPrivate];
}
return sharedStore;
}
如果是第一次调用initPrivate:方法:
- (instancetype)initPrivate
{
self = [super init];
if (self) {
_dictionary = [[NSMutableDictionary alloc] init];
}
return self;
}
我的第一部分代码存在问题,使用sharedStore:方法。这个变量sharedStore如何保存数据,每次调用此方法获取单例时,sharedStore都指向nil。
代码工作正常,所以绝对没有错。这是否意味着如果变量是静态的static BNRImageStore *sharedStore = nil;
将被忽略。
先谢谢,上面的代码摘自我正在阅读的书“IOS编程:BNR指南”。
答案 0 :(得分:0)
问题是sharedStore被声明为static而不是局部变量。永远不会破坏静态变量。静态变量不会存在于堆栈中,因此将其设置为nil不会破坏它。因此,如果您在此处显示将其设置为nil并不执行任何操作,并且它不会输入将创建它的条件。这有点违反直觉,但确实如此。
此处的代码中提供了一种显示此静态特性的简单方法:Why should you check a static variable for nil if it was initialized to nil on the previous line?即:
void plugh(void) {
static int xyzzy = 0;
printf (" %d", xyzzy); // or Obj-C equivalent.
xyzzy++;
}
并将其调用100次将产生:
0 1 2 3 4 ...
还有另一种使用dispatch_once来销售单身人士的方法。这里提供了一个使用sharedWeatherHTTPClient http://www.raywenderlich.com/59255/afnetworking-2-0-tutorial
的示例答案 1 :(得分:0)
静态变量只初始化一次,因此无论您调用方法static BNRImageStore *sharedStore = nil;
sharedStore
都只会运行一次
您可能已经在c中研究了存储类,并且有四个
对于静态varibales,初始化执行一次
注意:初始化和分配之间存在差异。
初始化:在定义时分配值。 e.g。
int a = 5; //this is initialization
分配:在定义后分配值时。 e.g。
int a = 0; //initialization
a = 6; //assignment
int b;
b = 10 //assignment
你可以说初始化是赋值的特例