同事有個問題糾結了一天,他存儲一個日期,如果本地有存儲過,下次進入頁面就默認存儲的日期,否則就默認明天的日期。在測試過程中他發現,當把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]。
- NSDate類幫你封裝了這樣的邏輯,讓你用起來比較方便,也有很多好的特性,具體可以去看一下工廠方法的相關文章。
- 在Objective-C層面所有對象的初始化都需要經過alloc和init。只是很多時候被工廠方法和語法糖等設計模式和語言特性給簡化了。