¿Qué tipo de error sarcástico es este iOS?

83

Tengo un código que uso para ordenar las fechas del calendario que se ve así:

#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 lo ejecuto en el simulador, todo está bien. Si lo ejecuto en el dispositivo, aparece este sarcástico mensaje de depuración.

2012-09-19 22: 40: 13.972 APPNAME [4923: 907] * - [__ NSCFCalendar components: fromDate:]: la fecha no puede ser nula

En realidad, ¿qué crees que significa esa operación con una fecha nula?

Se ha evitado una excepción por ahora.

Algunos de estos errores se informarán con esta queja, luego otras violaciones simplemente harán en silencio cualquier cosa aleatoria que resulte del nulo. Aquí está el rastreo donde esto ocurrió esta vez (algunos marcos pueden faltar debido a las optimizaciones del compilador):

Tienes que reírte de eso, pero no estoy seguro de qué está mal con mi dateFormatFromTemplate:código. Cualquier ayuda sería apreciada.

Ejecutando Xcode V 4.5 por cierto


ACTUALIZAR:

Traza atrás:

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

Así que supongo que las cosas van mal con mi dateAtBeginningOfDayForDatemétodo. Que se ve así:

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

Utilizo este método para dividir un NSDate dado en sus componentes principales para poder ordenarlos todos de manera más eficiente. Sin embargo, mi aplicación tiene que ser internacional, que es la razón por la que se usa NSLocalepara formatear la salida de fecha. Por lo que parece, tendré que modificar mi dateAtBeginningOfDayForDatepara trabajar también internacionalmente.

aleatorio
fuente
40
OK, esto me hizo reír. Alguien en Apple tiene un sentido del humor cruel ...
nneonneo
3
Dice que hay un seguimiento. ¿Qué hay en el backtrace?
nneonneo
2
Bueno, tenía curiosidad por saber cuál de esas dos líneas fallaba. ¿Cuál es el valor de formatString?
nneonneo
2
¿Realmente choca en una de esas dos líneas? Ahí es donde el retroceso ayudaría ...
nneonneo
2
Creo que es bastante obvio por el código que publicaste y el error que obtuviste inputDatedebe ser nil. Mire los marcos de la pila superior y vea si puede averiguar qué podría enviar la nilfecha de entrada.
nneonneo

Respuestas:

16

El error no ocurre en el código que publicó. Significa que en algún lugar tienes algo que se supone que es un NSDatey en su lugar lo es nil.

En cuanto al humor en el mensaje de error, nunca he visto ese mensaje, pero +1 a Apple. Algún ingeniero de la división Cocoa es tan divertido como los buenos ingenieros que Apple solía tener hace mucho tiempo.

Vea el tipo de diagnóstico que el compilador MPW C de Apple solía escupir http://www.netfunny.com/rhf/jokes/91q3/cerrors.html

Archivo analógico
fuente
Tiene aproximadamente una milla de largo, no hay mucho en él realmente. El caso es que si ejecuto el código anterior en el dispositivo solo [fmt setDateFormat:@"HH:mm dd MMM yyyy"];funciona bien. Así que supongo que eso dateFormatFromTemplate:está mal de alguna manera.
aleatorio
Este comentario solo está relacionado en términos de humor ... Una vez tuve que modificar la fuente al controlador de disco SunOS SCSI (sd.c). Había un comentario sobre un código de prueba de bits que decía / * snarf yummos de los sabrosos bits * /
JohnQ
6

Muchas gracias a nneonneo por ayudarme a resolver esto.

Mi problema es que mi aplicación tiene que funcionar a nivel internacional, por lo que necesitaba que se mostraran las fechas con respecto a la ubicación del usuario. Pensé que simplemente crearía una NSDateFormatterconfiguración regional para los usuarios y luego pasaría una fecha de cadena como esta:

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

Sin embargo, el problema es que estaba localizando el formato de fecha antes de pasar la fecha de la cadena. En mi caso se NSDateFormatterveía así después de la localización.

MMM dd, yyyy, HH:mm

Que el formato después de la localización podría verse de muchas formas diferentes después de la localización.

Entonces, pasar una cadena con un formato de HH:mm dd MMM yyyyestaba causando que regresara nil.

Lo cual es obvio ahora -.-

Entonces, en lugar de localizar cuando creo la fecha, creo las fechas con un formato estándar de HH:mm dd MMM yyyy. Luego, al mostrarlo, le doy formato NSDatea la configuración regional respectiva del usuario.

aleatorio
fuente
También debe conocer la "función" de la configuración regional .
Hot Licks