[NSDate alloc] init]與[NSDate date]

     同事有個問題糾結了一天,他存儲一個日期,如果本地有存儲過,下次進入頁面就默認存儲的日期,否則就默認明天的日期。在測試過程中他發現,當把app刪除後,按理說是沒有存儲這樣一個日期的,但是發現總是可以取到存儲的值,所以他疑惑了!

    是在沒找出原因,就讓我幫忙看了一下,就發現這樣一段代碼:

- (void)readSearchDateHistory

{

    NSString *filePath = [[TNUtils applicationCachesDirectory] stringByAppendingPathComponent:searchDateHistoryFileName];

    NSFileManager *fileManager = [NSFileManager defaultManager];

    if ([fileManager fileExistsAtPath:filePath isDirectory:nil])

    {

        self.searchHistoryDate = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

    }

    else

    {

        self.searchHistoryDate = [[NSDate alloc] init];

    }

}

他最終是判斷self.searchHistoryDate是否爲nil,以此爲是否有存儲值的依據。我就想是不是self.searchHistoryDate = [[NSDate alloc] init];的問題,打斷點測試發現,果然,self.searchHistoryDate = [[NSDate alloc] init]是有值的;問題原因找出來了。

但是,爲什麼會出現這樣的問題呢?

原來:[[NSDate alloc] init]等同於[NSDate date]


[NSDate date]是[NSDate alloc] init]的Factory Method(工廠方法)。

在執行[NSDate date]方法時,本質上執行的就是[[NSDate alloc] init]。

  1. NSDate類幫你封裝了這樣的邏輯,讓你用起來比較方便,也有很多好的特性,具體可以去看一下工廠方法的相關文章。
  2. 在Objective-C層面所有對象的初始化都需要經過alloc和init。只是很多時候被工廠方法和語法糖等設計模式和語言特性給簡化了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章