web-dev-qa-db-fra.com

Quel genre d'erreur sarcastique est cet iOS?

J'ai un code que j'utilise pour trier les dates de 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 le lance 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 que cette opération est censée signifier avec une date nulle?

Une exception a été évitée pour l'instant.

Quelques-unes de ces erreurs vont être signalées avec cette plainte, puis de nouvelles violations feront simplement silencieusement tout ce qui résulte du néant. Voici le backtrace où cela s'est produit cette fois (certaines images peuvent être manquantes en raison des optimisations du compilateur):

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

Exécution de Xcode V 4.5 btw


MISE À JOUR:

Retour en arrière:

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

Je suppose donc que les choses vont mal dans ma méthode dateAtBeginningOfDayForDate. 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 composants principaux afin de pouvoir les trier tous plus efficacement. Cependant, mon application doit être internationale, ce qui explique pourquoi utiliser NSLocale pour formater la sortie de la date. D'après ce qu'il semble, je devrai modifier mon dateAtBeginningOfDayForDate pour travailler à l'international également.

84
random

Un grand merci à nneonneo pour m'avoir aidé à comprendre cela.

Mon problème est que mon application doit fonctionner à l'international, j'avais donc besoin d'afficher les dates en fonction de l'emplacement de l'utilisateur. Je pensais que je créerais simplement un NSDateFormatter aux paramètres régionaux des utilisateurs, puis passerais une date de chaîne 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 j'étais en train de localiser le format de date avant de passer la date chaîne. Dans mon cas, NSDateFormatter ressemblait à ceci après la localisation.

MMM dd, yyyy, HH:mm

Ce que je le format après la localisation pourrait ressembler de nombreuses façons différentes après la localisation.

Donc, en passant dans une chaîne au format HH:mm dd MMM yyyy le faisait renvoyer nil.

Ce qui est évident maintenant -.-

Ainsi, au lieu de localiser lorsque je crée la date, je crée les dates avec un format standard de HH:mm dd MMM yyyy. Puis lors de l'affichage, je formate le NSDate aux paramètres régionaux respectifs des utilisateurs.

6
random

L'erreur ne se produit pas dans le code que vous avez publié. Cela signifie quelque part que 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 Apple il y a longtemps).

Découvrez le type de diagnostics du compilateur MPW C d'Apple utilisé pour cracher http://www.netfunny.com/rhf/jokes/91q3/cerrors.html

16
Analog File