2010-10-12 55 views
22

我想使用Objective C編寫一個簡單的函數,它接受一個NSDate對象並返回一個NSDate對象,該對象包含相同的日期值,但已從中刪除任何時間組件日期。使用Objective C/Cocoa從NSDate對象中刪除時間組件

例如,如果我要傳遞一個值爲'2010-10-12 09:29:34'的NSDate,該函數將返回2010-10-12 00:00:00。

我使用的功能似乎正常工作。但是,當我測試使用Instruments開發的iPhone應用程序時,它報告我正在使用的函數中存在內存泄漏。看看我的功能如下。哪裏有內存泄漏?有沒有更好的方法來實現我想要的功能?

在此先感謝!

-(NSDate *)dateWithOutTime:(NSDate *)datDate 
{ 
    if (datDate == nil) 
    { 
     datDate = [NSDate date]; 
    } 

    unsigned int  intFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 
    NSCalendar  *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; 
    NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease]; 

    components = [calendar components:intFlags fromDate:datDate]; 

    return [calendar dateFromComponents:components]; 
} 
+0

值得一提的是,NSDate的本身沒有組件的概念,因爲它是代表一個時間點的對象。沒有時間和語言環境,人類可讀的日期沒有固有的意義。即使時間在該日期的某個時間隱含在該語言環境中。 – uchuugaka 2014-04-13 10:19:25

回答

60

試試這個:

-(NSDate *)dateWithOutTime:(NSDate *)datDate { 
    if(datDate == nil) { 
     datDate = [NSDate date]; 
    } 
    NSDateComponents* comps = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:datDate]; 
    return [[NSCalendar currentCalendar] dateFromComponents:comps]; 
} 
+0

嗯,功能起作用。但是,當我使用儀器分析時,我仍然檢測到相同的內存泄漏。 – 2010-10-12 16:03:51

+1

這很奇怪,應該沒有內存泄漏,因爲所有的調用都是自動發佈的。再看一下你原來的實現,那裏也不應該有泄漏。你在模擬器或設備上運行泄漏嗎? – aegzorz 2010-10-12 16:20:18

+0

我正在使用模擬器和設備進行測試。在進一步調查後,我發現你是對的。在您提供的功能或我正在使用的原始功能中沒有內存泄漏。泄漏是我的代碼中的其他地方。感謝您的幫助。 – 2010-10-12 17:13:04

14
-(NSDate *)dateWithOutTime:(NSDate *)datDate{ 
    if(datDate == nil) { 
     datDate = [NSDate date]; 
    } 
    NSDateComponents* comps = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit fromDate:datDate]; 
    [comps setHour:00]; 
    [comps setMinute:00]; 
    [comps setSecond:00]; 
    [comps setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

    return [[NSCalendar currentCalendar] dateFromComponents:comps]; 
} 
+3

你爲什麼改變時區? – malhal 2013-12-05 20:14:55

+0

你忘了納秒。 '[comps setNanosecond:0]' – 2017-07-07 14:39:32