2010-10-12 7 views
22

J'essaye d'écrire une fonction simple en utilisant Objective C qui accepte un objet NSDate et retourne un objet NSDate qui contient la même valeur de date mais qui a supprimé des composants de temps la date.Suppression de composants temporels d'un objet NSDate à l'aide de Objective C/Cocoa

Par exemple, si je devais passer un NSDate avec une valeur de '2010-10-12 09:29:34' la fonction reviendrait 2010-10-12 00:00:00.

La fonction J'utilise semble fonctionner correctement. Cependant, lorsque je teste l'application iPhone que je développe avec Instruments, il signale une fuite de mémoire dans la fonction que j'utilise. Jetez un oeil à ma fonction ci-dessous. Où y a-t-il une fuite de mémoire? Y a-t-il un meilleur moyen d'atteindre la fonctionnalité que je désire?

Merci d'avance !!

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

Il convient de noter que NSDate lui-même n'a aucune notion de composants est un objet qui représente un point dans le temps. Une date lisible par un humain n'a pas de signification inhérente sans temps et lieu. Même si le temps est implicitement quelque temps pendant cette date dans cette locale. – uchuugaka

Répondre

60

Essayez ceci:

-(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, la fonction fonctionne. Cependant, je détecte toujours la même fuite de mémoire lorsque j'analyse en utilisant Instruments. –

+1

C'est bizarre, il ne devrait pas y avoir de fuites de mémoire puisque tous les appels sont auto-libérés. En regardant à nouveau votre implémentation d'origine, il ne devrait pas y avoir de fuite non plus. Courez-vous des fuites dans le simulateur ou sur un appareil? – aegzorz

+0

Je suis en train de tester à la fois le simulateur et l'appareil. Après une enquête plus approfondie, j'ai trouvé que vous avez raison. Il n'y a pas de fuite de mémoire dans la fonction que vous avez fournie ou la fonction d'origine que j'utilisais. La fuite est ailleurs dans mon code. Merci pour votre aide. –

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

Pourquoi changez-vous le fuseau horaire? – malhal

+0

Vous avez oublié nanoseconde. '[comps setNanosecond: 0]' –