Что за саркастическая ошибка в этой iOS?

83

У меня есть код, который я использую для сортировки календарных дат, который выглядит следующим образом:

#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

Если я запустил его в симуляторе, все в порядке. Если я запускаю его на устройстве, я получаю это саркастическое сообщение отладки.

2012-09-19 22: 40: 13.972 APPNAME [4923: 907] * - [__ NSCFCalendar components: fromDate:]: дата не может быть нулевой

Я имею в виду, что вы думаете, что эта операция должна означать нулевую дату?

Исключения пока удалось избежать.

О некоторых из этих ошибок будет сообщено вместе с этой жалобой, а затем дальнейшие нарушения будут просто молча выполнять любые случайные действия, возникающие из нуля. Вот след того, где это произошло на этот раз (некоторые кадры могут отсутствовать из-за оптимизации компилятора):

Вы должны смеяться над этим, но я не уверен, что не так с моим dateFormatFromTemplate:кодом. Любая помощь будет оценена.

Запуск Xcode V 4.5, кстати


ОБНОВИТЬ:

Обратная трассировка:

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

Так что я думаю, что с моим dateAtBeginningOfDayForDateметодом дела идут плохо . Это выглядит так:

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

Я использую этот метод, чтобы разбить данный NSDate на его основные компоненты, чтобы я мог более эффективно сортировать их. Однако мое приложение должно быть международным, что является причиной использования NSLocaleдля форматирования вывода даты. Судя по всему, мне нужно будет изменить свое, dateAtBeginningOfDayForDateчтобы работать на международном уровне.

случайный
источник
40
Хорошо, это меня рассмешило. У кого-то в Apple жестокое чувство юмора ...
nneonneo
3
Он говорит, что есть обратный след. Что в обратном прослеживании?
nneonneo
2
Что ж, мне было любопытно, какая из этих двух строк сломалась. В чем ценность formatString?
nneonneo
2
Действительно ли происходит сбой на одной из этих двух линий? Вот где
обратная
2
Я думаю, это довольно очевидно из кода, который вы разместили, и ошибки, которая inputDateдолжна быть у вас nil. Посмотрите на кадры более высокого стека и посмотрите, сможете ли вы выяснить, что может отправить nilдату ввода.
nneonneo

Ответы:

16

Ошибка не возникает в опубликованном вами коде. Это означает, что где-то у вас есть что-то, что должно быть, NSDateа вместо этого это nil.

Что касается юмора в сообщении об ошибке, я никогда не видел этого сообщения, но +1 к Apple. Некоторые инженеры из подразделения Cocoa столь же забавны, как и старые добрые инженеры Apple, которых много лет назад было.

Посмотрите, какой вид диагностики компилятор Apple MPW C использовал для вывода http://www.netfunny.com/rhf/jokes/91q3/cerrors.html

Аналоговый файл
источник
Это около мили в длину, на самом деле немного. Дело в том, что если я запускаю приведенный выше код на устройстве, только [fmt setDateFormat:@"HH:mm dd MMM yyyy"];оно работает нормально. Так что я предполагаю, что dateFormatFromTemplate:это в каком-то смысле неправильно.
random
Этот комментарий связан только с юмором ... Однажды мне пришлось изменить исходный код драйвера диска SunOS SCSI (sd.c). Над некоторым кодом тестирования битов был комментарий, в котором говорилось: / * snarf yummos from the вкусные кусочки * /
JohnQ
6

Большое спасибо nneonneo за то, что помог мне разобраться в этом.

Моя проблема в том, что мое приложение должно работать на международном уровне, поэтому мне нужно было отображать даты с учетом местоположения пользователя. Я думал, что просто создамNSDateFormatter языковой стандарт пользователя, а затем передаю дату в строке следующим образом:

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

Однако проблема в том, что я локализовал формат даты до того, как передал дату в строке. В моем случае это NSDateFormatterвыглядело после локализации.

MMM dd, yyyy, HH:mm

Который формат после локализации может выглядеть по-разному после локализации.

Таким образом, передавая строку в формате HH:mm dd MMM yyyy заставляла ее возвращаться nil.

Что сейчас очевидно -.-

Поэтому вместо локализации при создании даты я создаю даты в стандартном формате HH:mm dd MMM yyyy. Затем при отображении я форматирую NSDateдля пользователей соответствующей локали.

случайный
источник
Вы также должны знать о «особенностях» локали .
Hot Licks