当声明它的对象被解除分配时,静态声明的NSDateFormatter实例会发生什么?

时间:2013-07-19 20:52:23

标签: ios static nsdateformatter

我正在通过David Mark等人的更多iOS6开发手册,并且对与在tableviewcell类中声明静态NSDateFormatter实例相关的问题感到困惑。

在示例程序中,他们让读者创建了一个tableviewcell类,用于创建用于输入日期的单元格对象。他们建议在该tableviewcell类中声明静态NSDateFormatter实例。他们解释了基本原理如下:“你在这里做了什么?你定义了一个NSDateFormatter类型的本地静态变量__dateFormatter。你这样做是因为创建一个NSDateFormatter是一个昂贵的操作,你不想创建一个每次要格式化NSDate时都会生成新实例“

代码如下:

#import "SuperDBDateCell.h"
static NSDateFormatter *__dateFormatter = nil;
@interface SuperDBDateCell ()
@property (strong, nonatomic) UIDatePicker *datePicker;
- (IBAction)datePickerChanged:(id)sender;
@end
@implementation SuperDBDateCell
+ (void)initialize
{
    __dateFormatter = [[NSDateFormatter alloc] init];
    [__dateFormatter setDateStyle:NSDateFormatterMediumStyle];
}

我不明白的是,当包含此tableviewcell的视图消失时,实例_dateFormatter会发生什么...也就是说,此时不会释放此静态变量,然后每次包含父视图时重新创建重新创建此tableviewcell类的实例?如果没有,为什么不呢?

感谢您的帮助......我一直在寻找SO,以及苹果开发者网站,并且还找不到任何可以解释它的东西......

1 个答案:

答案 0 :(得分:2)

initialize类方法仅在应用程序的生命周期内调用一次。因此静态__dateFormatter将被初始化一次。它永远不会在应用程序的生命周期中解除分配。这是静态变量的要点。它不以任何方式绑定到类的实例。它存在于任何实例的范围之外。

除非您添加代码以明确将__dateFormatter设置为nil或分配新的数据格式化程序,否则其值将保持不变。

附注 - 使用此类代码存在一个问题。如果用户将您的应用程序置于后台,然后更改“设置”应用程序中的“区域格式”设置,并返回到您的应用程序,则此日期格式化程序仍将使用旧格式。每当你有一个带格式化程序的类时,理想情况下你应该监听NSCurrentLocaleDidChangeNotification通知,这样你就可以更新任何长期格式化程序以反映新的语言环境。