这个iOS有什么样的讽刺错误?

时间:2012-09-20 03:49:18

标签: ios objective-c debugging nsdateformatter

我有一些代码用于对日历日期进行排序,如下所示:

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

     

我的意思是,你是什么人   认为操作应该是一个零日期?

     

目前已避免例外。

     

其中一些错误将会发生   报告与此投诉,然后进一步违规将简单   默默地做任何从零开始随机的事情。这里是   回溯此次发生的位置(某些帧可能丢失   由于编译器优化):

你必须嘲笑它​​,但我不确定我的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以便在国际上工作。

2 个答案:

答案 0 :(得分:16)

您发布的代码中不会发生错误。这意味着某些地方你应该有NSDate,而不是nil

至于错误信息中的幽默,我从来没有看过那条消息,而是+1给Apple。可可部门的一些工程师和苹果过去很久以前的优秀老工程师一样有趣。

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

答案 1 :(得分: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格式化为用户各自的区域设置。