这个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:]:日期不能为零

我的意思是,您认为该操作应以零日期表示什么?

现在已经避免了异常。

这些错误中的一些错误将在此投诉中报告,然后进一步的违规将简单地无提示地执行nil导致的任何随机操作。这是这次发生的回溯(由于编译器优化,某些帧可能会丢失):

您必须嘲笑它​​,但是我不确定我的dateFormatFromTemplate:代码有什么问题。任何帮助,将不胜感激。

运行Xcode V 4.5 btw


更新:

回溯:

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
好,这确实让我发笑。苹果公司的某个人有一种残酷的幽默感……
nneonneo 2012年

3
它说存在回溯。回溯中有什么?
nneonneo 2012年

2
好吧,我很好奇那两条线哪一条崩溃了。有什么价值formatString
nneonneo 2012年

2
它真的崩溃在这两行之一吗?那是回溯将帮助的地方……
nneonneo 2012年

2
我认为从您发布的代码和您得到的错误inputDate必须是显而易见nil。查看较高的堆栈帧,看看是否可以找出nil输入日期的发送内容。
nneonneo 2012年

Answers:


16

您发布的代码中不会发生该错误。这意味着在某处您应该拥有NSDate,而应该是nil

至于错误消息中的幽默之处,我从未见过该消息,但对苹果公司+1。可可部门的一些工程师和苹果很多年前的老工程师一样有趣。

查看Apple MPW C编译器用来吐出http://www.netfunny.com/rhf/jokes/91q3/cerrors.html的诊断类型


它大约一英里长,实际上并不多。关键是,如果我在设备上运行上面的代码,[fmt setDateFormat:@"HH:mm dd MMM yyyy"];并且运行正常。所以我认为这dateFormatFromTemplate:在某种程度上是错误的。
2012年

此注释仅在幽默方面相关...我曾经不得不将源代码修改为SunOS SCSI磁盘驱动程序(sd.c)。在一些测试代码上方有一条评论,说/ *美味的部分* /
snarf yummos

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]];

但是,问题在于我传递字符串date之前本地化了日期格式。就我而言NSDateFormatter,本地化后看起来像这样。

MMM dd, yyyy, HH:mm

本地化后的格式在本地化后可能看起来有很多不同的方式。

因此,传递格式为的字符串会HH:mm dd MMM yyyy导致其返回nil

现在很明显 -.-

因此,我创建日期时不使用本地化方法,而是使用标准格式创建日期HH:mm dd MMM yyyy。然后在显示时,我将其格式化NSDate为用户各自的语言环境。


您还需要注意语言环境“功能”
Hot Licks
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.