在定义cachingvariables时,在objective-c中使用static关键字

我正在看下面的苹果示例源代码:

/* Cache the formatter. Normally you would use one of the date formatter styles (such as NSDateFormatterShortStyle), but here we want a specific format that excludes seconds. */ static NSDateFormatter *dateFormatter = nil; if (dateFormatter == nil) { dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"h:mm a"]; } 

试图弄清楚:

  • 为什么使用static关键字?

  • 如果在每次调用方法时将其设置为nil,这与caching的variables相等。

代码来自Tableview Suite演示中的示例4

静态variables通过重复调用函数保留其分配的值。 它们基本上就像全球价值观,只对这个function“可见”。

初始化语句只能执行一次。

这个代码在第一次使用函数的时候初始化了dateFormatter。 在对函数的每一个后续调用中,都会根据dateFormatter的值进行检查。 如果没有设置(这只会是第一次),一个新的dateFormatter被创build。 如果它被设置,那么将使用静态的dateFormattervariables。

值得熟悉静态variables。 他们可以非常方便,但也有缺点(在这个例子中,例如不可能释放dateFormatter对象)。

只是一个小窍门:有时候,在代码中放置一个断点,看看发生了什么,可能是一种教育。 随着程序的复杂性增加,这将成为一种无价的技能。

static ”function意味着“每次通过时不要评估等号右侧的内容,而是使用其以前的值”。

以极大的责任使用这个伟大的力量:你冒着使用一整天的记忆的风险,因为这些是永远不会消失的物体。 除了像NSDateFormatter这样的情况,这种情况很less适合。

为了参考的目的,这是我如何使用静态我的date格式化程序在表视图控制器中使用。

 + (NSDateFormatter *) relativeDateFormatter { static NSDateFormatter *dateFormatter; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ //NSLog(@"Created"); dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setTimeStyle:NSDateFormatterNoStyle]; [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; NSLocale *locale = [NSLocale currentLocale]; [dateFormatter setLocale:locale]; [dateFormatter setDoesRelativeDateFormatting:YES]; }); return dateFormatter; }