Was für ein sarkastischer Fehler ist dieses iOS?

83

Ich habe einen Code, mit dem ich Kalenderdaten sortieren kann, die so aussehen:

#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

Wenn ich es im Simulator laufen lasse, ist alles in Ordnung. Wenn ich es auf dem Gerät ausführe, erhalte ich diese sarkastische Debug-Meldung.

2012-09-19 22: 40: 13.972 APPNAME [4923: 907] * - [__ NSCFCalendar-Komponenten: fromDate:]: Datum darf nicht Null sein

Ich meine wirklich, was denkst du, soll eine Operation mit einem Null-Datum bedeuten?

Eine Ausnahme wurde vorerst vermieden.

Einige dieser Fehler werden mit dieser Beschwerde gemeldet, dann werden weitere Verstöße einfach stillschweigend das tun, was zufällig aus dem Nullpunkt resultiert. Hier ist die Rückverfolgung, in der dies diesmal aufgetreten ist (einige Frames fehlen möglicherweise aufgrund von Compiler-Optimierungen):

Sie müssen darüber lachen, aber ich bin mir nicht sicher, was mit meinem dateFormatFromTemplate:Code nicht stimmt . Jede Hilfe wäre dankbar.

Xcode V 4.5 übrigens ausführen


AKTUALISIEREN:

Rückverfolgung:

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

Ich denke, meine dateAtBeginningOfDayForDateMethode läuft schlecht . Welches sieht so aus:

/*
 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;
}

Ich verwende diese Methode, um ein bestimmtes NSDate in seine Kernkomponenten zu zerlegen, damit ich sie alle effizienter sortieren kann. Meine App muss jedoch international sein, was der Grund für die NSLocaleFormatierung der Datumsausgabe ist. Wie es scheint, muss ich meine ändern dateAtBeginningOfDayForDate, um auch international zu arbeiten.

zufällig
quelle
40
OK, das hat mich zum Lachen gebracht. Jemand bei Apple hat einen grausamen Sinn für Humor ...
nneonneo
3
Es heißt, es gibt eine Rückverfolgung. Was ist in der Rückverfolgung?
Nneonneo
2
Nun, ich war neugierig, welche dieser beiden Linien abgestürzt ist. Was ist der Wert von formatString?
Nneonneo
2
Stürzt es wirklich an einer dieser beiden Linien ab? Hier würde die Rückverfolgung helfen ...
nneonneo
2
Ich denke, es ist ziemlich offensichtlich aus dem Code, den Sie gepostet haben, und dem Fehler, den Sie bekommen haben, inputDatemuss sein nil. Schauen Sie sich die Frames mit dem höheren Stapel an und prüfen Sie, ob Sie herausfinden können, was das nilEingabedatum senden könnte .
Nneonneo

Antworten:

16

Der Fehler tritt in dem von Ihnen geposteten Code nicht auf. Es bedeutet, dass Sie irgendwo etwas haben, das ein sein soll, NSDateund stattdessen ist es nil.

Was den Humor in der Fehlermeldung betrifft, habe ich diese Meldung noch nie gesehen, aber +1 an Apple. Einige Ingenieure in der Cocoa-Abteilung sind so lustig wie die guten alten Ingenieure, die Apple vor langer Zeit hatte.

Schauen Sie sich die Art der Diagnose an, mit der der MPW C-Compiler von Apple http://www.netfunny.com/rhf/jokes/91q3/cerrors.html ausspuckt

Analoge Datei
quelle
Es ist ungefähr eine Meile lang, nicht viel drin. Die Sache ist, dass, wenn ich den obigen Code auf dem Gerät mit nur ausführe, [fmt setDateFormat:@"HH:mm dd MMM yyyy"];es gut läuft. Ich gehe also davon aus, dass dateFormatFromTemplate:das irgendwie falsch ist.
zufällig
Dieser Kommentar bezieht sich nur auf den Humor ... Ich musste einmal die Quelle auf den SunOS SCSI-Festplattentreiber (sd.c) ändern. Es gab einen Kommentar über einem Bit-Testcode, der / * snarf yummos von den leckeren Bits * /
JohnQ
6

Vielen Dank an nneonneo, der mir geholfen hat, das herauszufinden.

Mein Problem ist, dass meine App international funktionieren muss, sodass ich Daten für die Anzeige in Bezug auf den Benutzerstandort benötigte. Ich dachte, ich würde einfach ein NSDateFormatterGebietsschema für den Benutzer erstellen und dann ein Zeichenfolgendatum wie folgt übergeben:

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

Das Problem ist jedoch, dass ich das Datumsformat lokalisiert habe, bevor ich das Zeichenfolgendatum übergeben habe. In meinem Fall NSDateFormattersah es nach der Lokalisierung so aus.

MMM dd, yyyy, HH:mm

Welches ich das Format nach der Lokalisierung könnte viele verschiedene Möglichkeiten nach der Lokalisierung aussehen.

Das Übergeben eines Strings mit dem Format von HH:mm dd MMM yyyyführte also zur Rückkehr nil.

Was jetzt offensichtlich ist -.-

Anstatt zu lokalisieren, wann ich das Datum erstelle, erstelle ich die Daten mit einem Standardformat von HH:mm dd MMM yyyy. Bei der Anzeige formatiere ich NSDatedann das jeweilige Gebietsschema des Benutzers.

zufällig
quelle
Sie müssen auch die "Funktion" des Gebietsschemas kennen .
Hot Licks