在定义缓存变量时,在objective-c中使用static关键字

时间:2009-02-16 23:11:00

标签: objective-c caching 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,这相当于缓存变量。

代码来自Tableview Suite demo

中的示例4

3 个答案:

答案 0 :(得分:62)

静态变量在重复调用函数时保留其赋值。它们基本上就像只对该函数“可见”的全局值。

然而,初始化语句只执行一次。

此代码在第一次使用该函数时将dateFormatter初始化为nil。在对函数的每次后续调用中,都会根据dateFormatter的值进行检查。如果未设置(仅在第一次时为true),则会创建一个新的dateFormatter。如果已设置,则将使用静态dateFormatter变量。

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

只是一个提示:有时在代码中放置一个断点并查看正在发生的事情可能很有教育意义。随着程序复杂性的增加,这将成为一项非常宝贵的技能。

答案 1 :(得分:16)

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

使用这个强大的力量负责:你冒着使用大量内存的风险,因为这些东西永远不会消失。除了像NSDateFormatter这样的情况外,它很少适用。

答案 2 :(得分:1)

出于参考目的,这就是我在日历格式化程序中使用static来在表视图控制器中使用的方法。

+ (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;
}