ios - 当声明它的对象被释放时,静态声明的 NSDateFormatter 实例会发生什么?

标签 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 的 View 消失时,实例 _dateFormatter 会发生什么......也就是说,当时不是这个静态变量被释放,然后每次父 View 包含时重新创建重新创建此 tableviewcell 类的实例?如果不是,为什么不呢?

感谢您的帮助...我一直在查看 SO 和苹果开发者网站,但还没有找到任何可以解释它的内容...

最佳答案

initialize 类方法在应用程序的生命周期内只会被调用一次。所以静态的 __dateFormatter 将被初始化一次。它永远不会在应用程序的生命周期内被释放。这就是静态变量的意义所在。它不以任何方式绑定(bind)到类的实例。它存在于任何实例的范围之外。

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

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

关于ios - 当声明它的对象被释放时,静态声明的 NSDateFormatter 实例会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17755296/

相关文章:

ios - iphone组合标签栏和navigationController

ios - `[AVCaptureSession canAddOutput:output]` 间歇性地返回 NO。我能找出原因吗?

c - 如何静态编译ps(procps)

java - 为什么要使类静态更改字体和背景颜色?

ios - 在 iOS 中将本地时间转换为 EST

iphone - 使用 Test Flight App 对随机数进行 Beta 测试有什么危险?

ios - 如何使用 MFMailComposeViewController

java - 相互递归定义的静态字段导致程序卡住但不是没有线程而不是 gcj?

ios - 如何获得时间(下午 1 - 2 点)或(下午 2 - 3 点)

ios - Swift 3 中的日期格式化程序