如果在前一行初始化为nil,为什么要检查nil的静态变量?

时间:2012-01-07 20:33:50

标签: objective-c ios cocoa-touch

以下是来自Apple's iOS Core Data tutorial的代码示例,我认为条件语句检查对象是否为零是很奇怪的。如果条件之前的行将对象设置为nil,那么对象是否总是会计算为nil?

// A date formatter for the time stamp
static NSDateFormatter *dateFormatter = nil;
if (dateFormatter == nil) {
    dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
}

3 个答案:

答案 0 :(得分:19)

由于static。只要执行通过该语句,该变量就不会设置为nil,它只在程序启动时设置。

这是静态存储持续时间变量的一个特性。它们在启动时设置为初始值,并在此之后保留您设置的任何值。例如,以下代码:

void plugh(void) {
    static int xyzzy = 0;
    printf (" %d", xyzzy); // or Obj-C equivalent.
    xyzzy++;
}
如果你打电话给它,那么

将不会输出一长串零。它将输出:

0 1 2 3 4 ...

对于Apple代码,这意味着将根据需要创建日期格式化程序(除非您将返回设置为其他地方的nil)仅一次。如果对象创建是一件非常重要的事情,这对于性能来说可能很重要,但即使不是,也不能继续重新创建可以重复使用的东西。

答案 1 :(得分:5)

我假设这段代码来自函数体。您需要注意变量是static。这意味着是的,第一次调用此函数时,它将设置为nil。但是, next 时间调用该函数,它会保留前一次调用的值。

所以结果是lazy initialization。仅在第一次调用此函数时初始化新的NSDateFormatter

static本质上使它成为一个全局变量,初始化为该值,但仅对其声明的函数可见。

答案 2 :(得分:1)

"静态"意味着它只在初始化该类和第一次运行时评估一次。后续运行将跳过它并继续到下一行。