83 votes

Quel genre d'erreur sarcastique est-ce là ?

J'ai un code que j'utilise pour trier les dates du calendrier qui ressemble à ceci :

#if !(TARGET_IPHONE_SIMULATOR)
    NSString *formatString = [NSDateFormatter dateFormatFromTemplate:@"HH:mm dd MMM yyyy" options:0
                                                              locale:[NSLocale currentLocale]];
    [fmt setDateFormat:formatString];
#else
    [fmt setDateFormat:@"HH:mm dd MMM yyyy"];
#endif

Si je l'exécute dans le simulateur, tout va bien. Si je l'exécute sur l'appareil, j'obtiens ce message de débogage sarcastique.

2012-09-19 22:40:13.972 APPNAME [4923:907] * -[__NSCFCalendar components:fromDate :]: la date ne peut pas être nulle

Je veux dire, vraiment, que pensez-vous cette opération est censée signifier avec une date nulle ?

Une exception a été évitée pour le moment.

Quelques-unes de ces erreurs vont être rapportées avec cette plainte, alors les autres violations feront simplement silencieusement faire n'importe quelle chose aléatoire résultant du zéro. Voici la backtrace où cela s'est produit cette fois-ci (certaines images peuvent être manquantes). à cause des optimisations du compilateur) :

Vous devez en rire, mais je ne suis pas sûr de ce qui ne va pas avec mon dateFormatFromTemplate: code. Toute aide serait appréciée.

Exécution de Xcode V 4.5 en cours


UPDATE :

Backtrace :

0 CoreFoundation 0x39ff0e55 + 84
1 APPNAME 0x00040be1 -[MeetingsViewController dateAtBeginningOfDayForDate :] + 140

Donc je suppose que les choses vont mal dans mon dateAtBeginningOfDayForDate méthode. Qui ressemble à ceci :

/*
 Break down a given NSDate to its bare components for sorting
 */
- (NSDate *)dateAtBeginningOfDayForDate:(NSDate *)inputDate
{
    // Use the user's current calendar and time zone
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSTimeZone *timeZone = [NSTimeZone systemTimeZone];
    [calendar setTimeZone:timeZone];

    // Selectively convert the date components (year, month, day) of the input date
    NSDateComponents *dateComps = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:inputDate];

    // Set the time components manually
    [dateComps setHour:0];
    [dateComps setMinute:0];
    [dateComps setSecond:0];

    // Convert back
    NSDate *beginningOfDay = [calendar dateFromComponents:dateComps];
    return beginningOfDay;
}

J'utilise cette méthode pour décomposer une NSDate donnée en ses principaux composants afin de pouvoir les trier plus efficacement. Cependant, mon application doit être internationale, ce qui explique l'utilisation de la méthode NSLocale pour formater la sortie de la date. D'après ce que j'ai compris, je vais devoir modifier mon code d'accès. dateAtBeginningOfDayForDate de travailler également à l'échelle internationale.

16voto

Analog File Points 3539

L'erreur ne se produit pas dans le code que vous avez posté. Cela signifie que quelque part vous avez quelque chose qui est censé être un NSDate et à la place c'est nil .

Quant à l'humour dans le message d'erreur, je n'ai jamais vu ce message, mais +1 à Apple. Un ingénieur de la division Cocoa est aussi drôle que les bons vieux ingénieurs qu'Apple avait il y a longtemps.

Regardez le genre de diagnostics que le compilateur MPW C d'Apple avait l'habitude d'émettre. http://www.netfunny.com/rhf/jokes/91q3/cerrors.html

6voto

random Points 2856

Un grand merci à nneonneo pour m'avoir aidé à résoudre ce problème.

Le problème est que mon application doit fonctionner au niveau international et que j'avais besoin que les dates soient affichées en fonction de la localisation de l'utilisateur. J'ai pensé que je pourrais simplement créer un NSDateFormatter en fonction de la langue de l'utilisateur, puis passer une date sous forme de chaîne de caractères comme ceci :

 NSString *formatString = [NSDateFormatter dateFormatFromTemplate:@"HH:mm dd MMM yyyy" options:0
                                                              locale:[NSLocale currentLocale]];
date = [fmt dateFromString:[NSString stringWithFormat:@"%@ %@", obj.meetingTime, obj.meetingDate]];

Cependant, le problème est que je localisais le format de date avant J'ai passé la date en chaîne. Dans mon cas NSDateFormatter ressemblait à ça après la localisation.

MMM dd, yyyy, HH:mm

Ce qui veut dire que le format après la localisation peut avoir plusieurs aspects différents après la localisation.

Ainsi, en passant dans une chaîne de caractères avec un format de HH:mm dd MMM yyyy a provoqué son retour nil .

Ce qui est évident maintenant -.-

Ainsi, au lieu de localiser la date lorsque je la crée, je crée une date au format standard de HH:mm dd MMM yyyy . Ensuite, lors de l'affichage, je mets en forme le NSDate dans la locale de l'utilisateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X