我有这个代码,我多年来一直在重复使用。今年它破了,我不明白为什么。在我的应用中,我使用日历,即使用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&lt; = month&amp;&amp;月&lt; = 12'
我真的很困惑。特别是,因为在某些时候代码实际上在设备上运行,可能有不同的配置文件。
好的,我在代码中搜索了一下,找到了出错的地方。在特定时刻,使用错误的参数调用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];
}
在模拟器上运行时,年的值为 2015 ,如预期的那样。在设备上运行代码,值为 4294969311 。所以,不知何故,“CFCalendarDecomposeAbsoluteTime”不喜欢我的设备。
我希望你能帮助我;如果您需要更多信息,请与我们联系。
答案 0 :(得分:0)
我猜你用这段代码得到了一些64位的警告。
NSInteger year, month, day;
…
CFCalendarDecomposeAbsoluteTime(calendar, absoluteTime, "yMd", &year, &month, &day);
CFCalendarDecomposeAbsoluteTime
的文档说,&#34;所有单位的类型都是int。&#34;
在64位代码中,NSInteger
与int
不同。
如果可以,请查找更新版本KLDate
,或更新您的副本以修复缺陷。
- (id)initWithDate:(NSDate *)date {
NSParameterAssert(date!=nil);
// NSInteger year, month, day;
int 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];
}
答案 1 :(得分:0)
顺便说一句,虽然我很高兴您解决了问题,但除了CFCalendarDecomposeAbsoluteTime
之外,您还可以考虑使用NSCalendar
方法components:fromDate:
:
- (instancetype)initWithDate:(NSDate *)date {
NSParameterAssert(date);
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date];
return [self initWithYear:components.year month:components.month day:components.day];
}