2009-02-16 19 views
42

我在看下面的苹果示例源代码时:使用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"]; 
} 

试图找出:

  • 为什么使用静态关键词?

  • 如果在每次调用方法时将其设置为nil,它将如何等于缓存变量。

的代码是从实施例4中Tableview Suite demo

回答

62

静态变量通过重复调用函数保留其分配的值。它们基本上像全局值,只对该功能“可见”。

但是,初始化语句只执行一次。

此代码在第一次使用函数时将dateFormatter初始化为零。在每次后续的函数调用时,都会根据dateFormatter的值进行检查。如果没有设置(这只会在第一次是真的),则会创建一个新的dateFormatter。如果它被设置,那么将使用静态的dateFormatter变量。

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

只是一个提示:有时候可以在代码中放置一个断点并看看发生了什么。随着程序的复杂程度的提高,这将成为无价的技能。

16

static”功能是指“不上等号的右边评估的东西通过签署每次使用之前的值改为”在这种情况下。

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

+10

我知道这是老问题,但不知道这个静态关键字与ARC的关系的影响? – codejunkie 2012-01-13 21:25:58

+3

@ codejunkie静态存储在与堆不同的位置。 ARC关心保留和释放堆内存,以便值可以保持超出堆栈帧。因此,我怀疑ARC对静态变量有什么影响。 – smileBot 2014-03-14 20:32:11

1

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

+ (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; 
} 
相关问题