为什么你应该检查一个静态variables为零,如果它在上一行被初始化为零?

下面是来自苹果的iOS Core Data教程的代码示例,我认为条件语句正在检查对象是否为零是奇怪的。 如果条件之前的行将对象设置为零,那么对象总是不会评估为零?

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

由于static 。 只要执行通过这个语句,这个variables就不会被设置为nil ,它只能在程序启动时设置。

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

 void plugh(void) { static int xyzzy = 0; printf (" %d", xyzzy); // or Obj-C equivalent. xyzzy++; } 

如果你把它称为一个被诅咒的时间,将不会输出一长串的零。 它会输出:

 0 1 2 3 4 ... 

在Apple代码的情况下,这意味着date格式化程序将按需创build,并且(除非您将其设置 nil )。 如果创build对象是一件不重要的事情,这对于性能来说可能是重要的,但是即使不是,连续地重新创build可以简单地重用的东西也是没有意义的。

我假设这个代码是从一个函数的主体。 你需要注意的是该variables是static 。 这意味着是的,第一次调用这个函数时,它将被设置nil 。 但是, 一次该函数被调用时,它将保留之前调用的值。

所以这个结果是懒惰的初始化 。 只有在第一次调用这个函数时才会初始化一个新的NSDateFormatter

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

“静态”意味着只有初始化该类和第一次运行时才评估一次。 随后的运行将跳过它并继续到下一行。