我不确定这是做什么的。 dateFormatter只能在第一次设置吗?
static NSDateFormatter *dateFormatter = nil;
if (dateFormatter == nil) {
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
}
通常我会读到这意味着,设置为零,然后检查它是否为零,但是如果我在条件内的NSLog,它只被调用一次?
如果你可以更深入地解释静态,那么额外的点,我知道它会创建一个全局变量(?),但就此而言。
答案 0 :(得分:7)
不,static
不会使dateFormatter
成为课程的一部分。它可能看起来像那样,但static
不是Objective-C的特性,对类没有任何了解。
static
是标准C语言的功能。请记住,Objective-C只是C的扩展。如果在方法中使用static
,它将创建一个仅在该方法中可见的全局变量。
这意味着此变量未在堆栈上分配,而是在数据段中分配。方法中本地定义的变量(非静态变量)与方法调用完成后返回的代码地址一起放在堆栈上 - 因此当执行离开方法时,本地方法的变量就消失了。在此方法中,dateFormatter
始终表示内存中的相同位置。
在这种情况下使dateFormatter
静态的要点是提高性能 - 您始终使用相同的格式化程序格式化日期,因此每次重新创建该格式化程序都没有意义,因此创建并保存它只进入一次全局变量。
答案 1 :(得分:1)
像Michal所说,“静态”是标准C的一部分。它有两个同样重要的效果:
答案 2 :(得分:0)
dateFormatter第一次只能设置吗?
不,您可以设置格式并使用,然后使用stringFromDate:(NSDate*) aDate
方法将日期转换为格式的字符串。
答案 3 :(得分:-1)
静态意味着它是一个全局变量,但是在这种情况下只能在函数中访问它,静态块将发生一次。其余的将每次都发生,但因为检查它是否已经初始化,“if”中的块也将发生一次。 因此,唯一会运行多次的代码是检查“if”条件。