我正在阅读 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 的 View 消失时,实例 _dateFormatter 会发生什么......也就是说,当时不是这个静态变量被释放,然后每次父 View 包含时重新创建重新创建此 tableviewcell 类的实例?如果不是,为什么不呢?
感谢您的帮助...我一直在查看 SO 和苹果开发者网站,但还没有找到任何可以解释它的内容...
最佳答案
initialize
类方法在应用程序的生命周期内只会被调用一次。所以静态的 __dateFormatter
将被初始化一次。它永远不会在应用程序的生命周期内被释放。这就是静态变量的意义所在。它不以任何方式绑定(bind)到类的实例。它存在于任何实例的范围之外。
除非您添加代码以将 __dateFormatter
显式设置为 nil
或分配新的数据格式化程序,否则它的值将保持不变。
旁注 - 使用此类代码存在一个问题。如果用户将您的应用程序置于后台,然后在“设置”应用程序中更改“区域格式”设置,然后返回到您的应用程序,此日期格式化程序仍将使用旧格式。每当你有一个带有格式化程序的类时,理想情况下你应该监听 NSCurrentLocaleDidChangeNotification
通知,这样你就可以更新任何长期存在的格式化程序以反射(reflect)新的语言环境。
关于ios - 当声明它的对象被释放时,静态声明的 NSDateFormatter 实例会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17755296/