【发布时间】:2015-01-03 12:12:35
【问题描述】:
我有这个代码,多年来我一直在重复使用。今年它坏了,我不明白为什么。在我的应用程序中,我使用日历,即使用 KLDate 类。
在该类中,有一个方法如下所示:
- (id)initWithYear:(NSInteger)year month:(NSUInteger)month day:(NSUInteger)day {
NSParameterAssert(1 <= month && month <= 12);
NSParameterAssert(1 <= day && day <= 31);
if (![super init])
return nil;
_year = year;
_month = month;
_day = day;
return self;
}
如果我在模拟器中运行我的应用程序,它就可以正常工作。但是,当我尝试在我的设备上运行它时,应用程序崩溃了,告诉我
*** -[KLDate initWithYear:month:day:], /.../Classes/Calendar/KLDate.m:79 中的断言失败
和
*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效参数不是 令人满意:1
我真的很困惑。特别是,因为在某些时候代码实际上是在设备上运行的,可能使用不同的配置文件。
好的,我在代码中搜索得更深一些,找到了出错的地方。在特定时刻,使用错误的参数调用 initWithYear:
- (id)initWithDate:(NSDate *)date {
NSParameterAssert(date!=nil);
NSInteger year, month, day;
CFAbsoluteTime absoluteTime = CFDateGetAbsoluteTime((CFDateRef)date);
CFCalendarRef calendar = CFCalendarCopyCurrent();
CFCalendarDecomposeAbsoluteTime(calendar, absoluteTime, "yMd", &year, &month, &day);
CFRelease(calendar);
return [self initWithYear:year month:month day:day];
}
在模拟器上运行时,year 的值为 2015,正如预期的那样。在设备上运行代码,值为4294969311。所以,不知何故,“CFCalendarDecomposeAbsoluteTime”不喜欢我的设备。
希望你能帮助我;如果您需要更多信息,请告诉我。
【问题讨论】:
-
你能显示你调用初始化程序的代码吗?可能是 64 位代码的问题
-
查看我的最新编辑。我越来越近了
-
顺便说一句,您的断言语句不正确。我想你打算
NSParameterAssert(1 >= month && month <= 12);和NSParameterAssert(1 >= day && day <= 31);。此外,将年份设为有符号,而将月份和日期设为无符号似乎有点奇怪。 -
这是有道理的,因为我们在第 0 年之前有几年,但我们没有负月份或天数