2013-07-19 50 views
0

我正在通過David Mark等人的「更多iOS6開發」書籍工作,並對與在tableviewcell類中聲明靜態NSDateFormatter實例相關的問題感到困惑。當聲明它的對象被釋放時,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]; 
} 

什麼,我不明白是發生了什麼實例_dateFormatter當包含此tableviewcell的視野中消失。 ..也就是說,這個靜態變量當時是不是已經釋放了,然後每當包含這個tableviewcell類的一個實例的父視圖被重新創建時重新創建呢?如果沒有,爲什麼不呢?

感謝您的幫助......我一直在尋找通過SO,而蘋果開發者網站,以及和一直沒能找到任何東西,解釋它...

+0

「UITableViewCell」在滾動出視圖時被重用,所以當靜態日期格式化程序被實例化時,它將在表視圖單元格被重用時可用。 – bobnoble

+2

@bobnoble單元重用與'__dateFormatter'靜態變量的生命週期無關。 – rmaddy

回答

2

initialize類方法只會在應用程序的生命週期中調用一次。所以靜態__dateFormatter將被初始化一次。它永遠不會在應用程序的生命週期中被釋放。這是一個靜態變量的重點。它不以任何方式綁定到類的實例。它存在於任何實例的範圍之外。

除非您添加代碼以明確設置__dateFormatternil或指定新的數據格式化程序,否則其值將保留原位。

備註 - 使用此類代碼有一個問題。如果用戶將您的應用置於後臺,然後更改「設置」應用中的「區域格式」設置並返回到您的應用,則此日期格式化工具仍將使用舊格式。每當你有一個格式化程序的課程,理想情況下你應該聽取NSCurrentLocaleDidChangeNotification通知,以便你可以更新任何長期居住的格式化程序以反映新的區域設置。

+0

非常感謝你提供了這樣一個清晰而有用的解釋。 –