这件目标做什么?

时间:2010-09-22 06:15:31

标签: iphone objective-c c

我不确定这是做什么的。 dateFormatter只能在第一次设置吗?

static NSDateFormatter *dateFormatter = nil;

if (dateFormatter == nil) {
    dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
} 

通常我会读到这意味着,设置为零,然后检查它是否为零,但是如果我在条件内的NSLog,它只被调用一次?

如果你可以更深入地解释静态,那么额外的点,我知道它会创建一个全局变量(?),但就此而言。

4 个答案:

答案 0 :(得分:7)

不,static不会使dateFormatter成为课程的一部分。它可能看起来像那样,但static不是Objective-C的特性,对类没有任何了解。

static是标准C语言的功能。请记住,Objective-C只是C的扩展。如果在方法中使用static,它将创建一个仅在该方法中可见的全局变量。

这意味着此变量未在堆栈上分配,而是在数据段中分配。方法中本地定义的变量(非静态变量)与方法调用完成后返回的代码地址一起放在堆栈上 - 因此当执行离开方法时,本地方法的变量就消失了。在此方法中,dateFormatter始终表示内存中的相同位置。

在这种情况下使dateFormatter静态的要点是提高性能 - 您始终使用相同的格式化程序格式化日期,因此每次重新创建该格式化程序都没有意义,因此创建并保存它只进入一次全局变量。

答案 1 :(得分:1)

像Michal所说,“静态”是标准C的一部分。它有两个同样重要的效果:

  1. “static”生成a的值 即使在变量之后,变量仍然存在 超出了范围。
  2. “static”仅生成变量 在其翻译单位内可见 (其中“翻译单位”是任何 已经过的非标头源文件 预处理)。如果你有两个 全局变量或常量 同名的不同 翻译单位,避免的一种方法 链接时名称冲突是 使两个变量都是静态的。
  3. 查看优秀的Wikipedia article on "static variable"

答案 2 :(得分:0)

dateFormatter第一次只能设置吗?

不,您可以设置格式并使用,然后使用stringFromDate:(NSDate*) aDate方法将日期转换为格式的字符串。

答案 3 :(得分:-1)

静态意味着它是一个全局变量,但是在这种情况下只能在函数中访问它,静态块将发生一次。其余的将每次都发生,但因为检查它是否已经初始化,“if”中的块也将发生一次。 因此,唯一会运行多次的代码是检查“if”条件。