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

Kyl*_*yes 8 cocoa-touch objective-c ios

下面是来自Apple的iOS核心数据教程的代码示例,我认为条件语句检查对象是否为零是很奇怪的.如果条件之前的行将对象设置为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];
}
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 19

因为static.nil每当执行通过该语句时,此变量都不会设置为仅在程序启动时设置.

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

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

如果你把它叫做很多次,它将不会输出一长串零.它将输出:

0 1 2 3 4 ...
Run Code Online (Sandbox Code Playgroud)

在苹果代码的情况下,次,这意味着日期格式将根据需要创建和(除非你把它nil别的地方)只有一次.如果对象创建是一件非常重要的事情,这对于性能来说可能很重要,但即使没有,也无法继续重新创建可以重复使用的东西.


Jon*_*art 5

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

所以结果是懒惰的初始化.NSDateFormatter仅在第一次调用此函数时初始化new .

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