Какая саркастическая ошибка в этом iOS?

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

#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 компоненты: fromDate:]: дата не может быть nil

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

На данный момент исключение исключено.

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

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

Запуск Xcode V 4.5 btw


UPDATE:

Backtrace:

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 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 для работы на международном уровне.

Ответ 1

Большое спасибо 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 для соответствующего языку пользователя.

Ответ 2

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

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

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