为什么静态变量在初始化后没有指向nil?

时间:2014-08-31 05:16:07

标签: ios objective-c static-variables

我正在按照一个例子来了解单身人士,但我对代码感到困惑,特别是对静态变量的使用。以下是代码: 这是代码检查这是否是第一次初始化变量。

+ (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指南”。

2 个答案:

答案 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中研究了存储类,并且有四个

  1. auto
  2. extern
  3. 静态
  4. 注册
  5. 对于静态varibales,初始化执行一次

    注意初始化分配之间存在差异。

    初始化:在定义时分配值。 e.g。

    int a = 5; //this is initialization
    

    分配:在定义后分配值时。 e.g。

    int a = 0; //initialization
    a = 6; //assignment
    int b;
    b = 10 //assignment
    

    你可以说初始化是赋值的特例