【问题标题】:what happens to a statically declared instance of NSDateFormatter when the object that declared it is deallocated?当声明它的对象被释放时,静态声明的 NSDateFormatter 实例会发生什么?
【发布时间】:2013-07-20 04:58:26
【问题描述】:

我正在阅读 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,以及苹果开发者网站,但还没有找到任何可以解释它的东西...

【问题讨论】:

  • A UITableViewCell 在滚动出视图时会被重用,因此当静态日期格式化程序被实例化时,它将在重用表格视图单元格时可用。
  • @bobnoble 单元重用与__dateFormatter 静态变量的生命周期无关。

标签: ios static nsdateformatter


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢您提供如此清晰而有帮助的解释。
猜你喜欢
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
相关资源
最近更新 更多