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


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

2012-09-19 22:40:13.972 APPNAME [4923:907] * -[__NSCFCalendar componentes: FromDate:]: la fecha no puede ser nil

Quiero decir realmente, ¿qué ¿crees que esa operación se supone que significa con una fecha nula?

Se ha evitado una excepción para ahora.

Algunos de estos errores van a ser reportados con esta queja, luego otras violaciones simplemente silenciosamente hacer cualquier cosa al azar resulta de la nada. Aquí está el backtrace donde esto ocurrió esta vez (algunos cuadros pueden faltar debido a optimizaciones del compilador):

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

Ejecutando Xcode V 4.5 btw


ACTUALIZACIÓN:

Backtrace:

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

Así que supongo que las cosas van mal en mi método dateAtBeginningOfDayForDate. 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 descomponer un NSDate dado a sus componentes principales para que pueda ordenarlos todos de manera más eficiente. Sin embargo, mi aplicación tiene que ser internacional, que es la razón detrás de usar NSLocale para formalizar la salida de fecha. Por lo que parece voy a tener que alterar mi dateAtBeginningOfDayForDate para trabajar internacionalmente también.

Author: random, 2012-09-20

2 answers

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

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

Echa un vistazo al tipo de diagnóstico que el compilador MPW C de Apple usó para escupir http://www.netfunny.com/rhf/jokes/91q3/cerrors.html

 16
Author: Analog File,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-20 04:05:07

Muchas gracias a nneonneo por ayudarme a resolver esto.

Mi problema es que mi aplicación tiene que funcionar internacionalmente, por lo que necesitaba fechas para mostrar con respecto a la ubicación del usuario. Pensé que simplemente crearía un NSDateFormatter a la configuración regional de 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 pasé la cadena fecha. En mi caso NSDateFormatter se veía así después de la localización.

MMM dd, yyyy, HH:mm

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

Así que pasar una cadena con un formato de HH:mm dd MMM yyyy estaba causando que regresara nil.

Lo cual es obvio ahora -.-

Así que en lugar de localizar cuando creo la fecha, creo las fechas con un formato estándar de HH:mm dd MMM yyyy. Luego, cuando se muestra, formateo el NSDate a la configuración regional respectiva de los usuarios.

 6
Author: random,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:46:27