Що це за саркастична помилка це 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] * - [__ NSCFC Календарні компоненти: 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. Деякі інженери підрозділу какао такі ж смішні, як і старі добрі інженери, які Apple використовувала багато часу тому.

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


Він довжиною близько милі, насправді в ньому не так багато. Справа в тому, що якщо я запускаю наведений вище код на пристрої, лише [fmt setDateFormat:@"HH:mm dd MMM yyyy"];він працює нормально. Тож я припускаю, що dateFormatFromTemplate:це якось неправильно.
випадковий

Цей коментар пов'язаний лише з точки зору гумору ... Одного разу мені довелося змінити джерело на драйвер диска SunOS SCSI (sd.c). Був коментар над деяким кодом бітового тестування, який сказав / * snarf yummos from the fity bits * /
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.