Iphone 这个objective-c在做什么?

Iphone 这个objective-c在做什么?,iphone,objective-c,c,Iphone,Objective C,C,我真的不知道这是怎么回事。dateFormatter仅可在第一次设置吗 static NSDateFormatter *dateFormatter = nil; if (dateFormatter == nil) { dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setTimeStyle:NSDateFormatterMediumStyle]; [dateFormatter setDateS

我真的不知道这是怎么回事。dateFormatter仅可在第一次设置吗

static NSDateFormatter *dateFormatter = nil;

if (dateFormatter == nil) {
    dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
} 
通常我会把它理解为,将某物设置为nil,然后检查它是否为nil,但是如果我在该条件下记录,它只会被调用一次


额外要点如果你能更深入地解释静态,我知道它创建了一个全局变量(?),但仅此而已。

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

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

dateFormatter是否仅可在第一次设置

static NSDateFormatter *dateFormatter = nil;

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

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

dateFormatter仅可在第一次设置吗

static NSDateFormatter *dateFormatter = nil;

if (dateFormatter == nil) {
    dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
} 
不,您可以设置格式,然后使用方法
stringFromDate:(NSDate*)aDate
将日期转换为具有格式的字符串。

正如Michal所说,“静态”是标准C的一部分。它有两个同等重要的作用:

  • “静态”使 即使变量已被删除,变量仍会保留 超出范围
  • “static”只生成一个变量 在其翻译单元中可见 (如果“翻译单位”是任何 已删除的非标头源文件 预处理)。如果你有两个 具有全局变量或常量的 同一个名字在不同的地方 翻译单位,一种避免 出现链接时间名称冲突 使这两个变量都是静态的
  • 请看精彩之处。

    正如迈克尔所说,“静态”是标准C的一部分。它有两个同样重要的作用:

  • “静态”使 即使变量已被删除,变量仍会保留 超出范围
  • “static”只生成一个变量 在其翻译单元中可见 (如果“翻译单位”是任何 已删除的非标头源文件 预处理)。如果你有两个 具有全局变量或常量的 同一个名字在不同的地方 翻译单位,一种避免 出现链接时间名称冲突 使这两个变量都是静态的

  • 请参阅优秀的。

    不,
    静态
    不会使
    日期格式化程序成为类的一部分。看起来可能是这样,但是
    static
    不是Objective-C的特性,对类一无所知

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

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


    在这种情况下,将
    dateFormatter
    设置为静态的目的是提高性能-您总是使用相同的格式化程序格式化日期,因此每次重新创建该格式化程序是没有意义的,因此它只创建一次并保存到全局变量中。

    否,
    static
    不会使
    dateFormatter
    成为类的一部分。看起来可能是这样,但是
    static
    不是Objective-C的特性,对类一无所知

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

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


    在这种情况下,将
    dateFormatter
    设置为静态的目的是提高性能-您总是使用相同的格式化程序格式化日期,因此每次重新创建该格式化程序是没有意义的,因此它只创建一次并保存到全局变量中。

    它实际上不是类的一部分,甚至是该文件的C全局(或者更可能是它所在的函数/方法)。但是效果是一样的,我明白了。回答得很好。所以这条线,即使它在函数中属于类?是的,但只能从这个函数中理解,正如其他人所说,它不是类的一部分,而是某种私有全局,但作为一个概念,它可以被认为是类的一部分。对我来说,这类问题似乎引发了更多的问题。为什么如果它是一个全局变量,只有在该函数中才可访问,那么每次调用该函数时它不会被调用?全局意味着它存在于程序的上下文中,而不是实例的上下文中。这并不意味着它可以从任何地方访问。它实际上不是类的一部分,甚至不是该文件的C全局(或者更可能是它所在的函数/方法)。但是效果是一样的,我明白了。回答得很好。所以那条线,即使它在