应用程序在模拟器上运行,而不是在设备上运行
App runs on Simulator, not on device
我有这段代码,多年来我一直在重复使用它。今年它坏了,我不明白为什么。在我的应用程序中,我使用日历,即使用 KLDate class.
在那个class中,有一个方法看起来像这样:
- (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;
}
如果我在模拟器中运行我的应用程序,它工作得很好。然而,当我尝试在我的设备上运行它时,应用程序崩溃了,告诉我
*** Assertion failure in -[KLDate initWithYear:month:day:], /.../Classes/Calendar/KLDate.m:79
和
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not
satisfying: 1 <= month && month <= 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];
}
在模拟器上运行时,year 的值为 2015,正如预期的那样。在设备上运行代码,值为4294969311。所以,不知何故,"CFCalendarDecomposeAbsoluteTime" 不喜欢我的设备。
希望你能帮助我;如果您需要更多信息,请告诉我。
我猜您会收到一些有关此代码的 64 位警告。
NSInteger year, month, day;
…
CFCalendarDecomposeAbsoluteTime(calendar, absoluteTime, "yMd", &year, &month, &day);
CFCalendarDecomposeAbsoluteTime
的文档说,"The type of all units is int."
在 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];
}
顺便说一句,很高兴您解决了问题,除了 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];
}
我有这段代码,多年来我一直在重复使用它。今年它坏了,我不明白为什么。在我的应用程序中,我使用日历,即使用 KLDate class.
在那个class中,有一个方法看起来像这样:
- (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;
}
如果我在模拟器中运行我的应用程序,它工作得很好。然而,当我尝试在我的设备上运行它时,应用程序崩溃了,告诉我
*** Assertion failure in -[KLDate initWithYear:month:day:], /.../Classes/Calendar/KLDate.m:79
和
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: 1 <= month && month <= 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];
}
在模拟器上运行时,year 的值为 2015,正如预期的那样。在设备上运行代码,值为4294969311。所以,不知何故,"CFCalendarDecomposeAbsoluteTime" 不喜欢我的设备。
希望你能帮助我;如果您需要更多信息,请告诉我。
我猜您会收到一些有关此代码的 64 位警告。
NSInteger year, month, day;
…
CFCalendarDecomposeAbsoluteTime(calendar, absoluteTime, "yMd", &year, &month, &day);
CFCalendarDecomposeAbsoluteTime
的文档说,"The type of all units is int."
在 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];
}
顺便说一句,很高兴您解决了问题,除了 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];
}