2010-10-12 4 views
22

Próbuję napisać prostą funkcję przy użyciu Objective C, który akceptuje obiekt NSDate i zwraca obiekt NSDate zawierający tę samą wartość daty, ale usunął wszystkie składniki czasu z data.Usuwanie komponentów czasu z obiektu NSDate za pomocą Objective C/Cocoa

Na przykład, jeśli mam przekazać NSDate o wartości "2010-10-12 09:29:34" funkcja powróci 2010-10-12 00:00:00.

Funkcja, której używam, wydaje się działać prawidłowo. Jednak kiedy testuję aplikację na iPhone'a, którą opracowuję z Instruments, raportuje, że w funkcji, której używam, występuje przeciek pamięci. Spójrz na moją funkcję poniżej. Gdzie jest wyciek pamięci? Czy istnieje lepszy sposób na osiągnięcie pożądanej funkcjonalności?

Z góry dziękuję !!

-(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

Warto zauważyć, że sam nie ma pojęcia NSDate komponentów, ponieważ jest to obiekt, który reprezentuje punkt w czasie. Data czytelna dla człowieka nie ma żadnego właściwego znaczenia bez czasu i lokalizacji. Nawet jeśli czas jest pośrednio jakiś czas w tym dniu w tym locale. – uchuugaka

Odpowiedz

60

Spróbuj tego:

-(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

Hmmmmmm, funkcja działa. Jednak wciąż wykrywam ten sam wyciek pamięci, gdy analizuję użycie Instrumentów. –

+1

To dziwne, nie powinno być przecieków pamięci, ponieważ wszystkie wywołania są autoodtwarzane. Patrząc na twoją pierwotną implementację ponownie, nie powinno być tam żadnych przecieków. Czy nie ma wycieków w symulatorze lub na urządzeniu? – aegzorz

+0

Testuję z symulatorem i urządzeniem. Po dalszych badaniach stwierdziłem, że masz rację. Nie ma wycieku pamięci w podanej funkcji lub oryginalnej funkcji, której używałem. Przeciek jest gdzieś indziej w moim kodzie. Dzięki za pomoc. –

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

Dlaczego zmieniasz strefę czasową? – malhal

+0

Zapomniałeś nanosekundy. '[comps setNanosecond: 0]' –

Powiązane problemy