这个 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-1922:40:13.972 APPNAME [4923.907] * -[ _ _ NSCFCalendar Date 不能为空

说真的,你觉得 你以为那个手术就意味着没有约会吗?

现在已经避免了一个例外。

其中一些错误将是 举报,那么进一步的违规行为只会 静默地做任何随机的事情从零结果 回溯这次发生的地方(一些帧可能丢失 由于编译器优化) :

你不得不嘲笑它,但我不知道我的 dateFormatFromTemplate:代码出了什么问题。如果你能帮忙,我将不胜感激。

运行 Xcode V 4.5 btw


更新:

回溯:

0 CoreFoundation 0x39ff0e55 + 84
1 片名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工作以及国际。

17538 次浏览

错误不会发生在您发布的代码中。这意味着在某个地方,你有一些本应该是 NSDate的东西,而实际上它是 nil

至于在错误信息中的幽默,我从来没有见过这个信息,但 + 1给苹果。可可部门的一些工程师和很久以前苹果公司的老工程师一样有趣。

看看苹果的 MPW C 编译器用来输出 http://www.netfunny.com/rhf/jokes/91q3/cerrors.html的那种诊断

非常感谢 新尼奥州帮我解决这个问题。

我的问题是,我的应用程序必须在国际上工作,所以我需要的日期显示相对于用户的位置。我想我只需要为用户区域创建一个 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格式化为用户各自的语言环境。