应用程序在模拟器上运行,而不是在设备上运行

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 位代码中,NSIntegerint 不同。

如果可以,请寻找更新版本 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];
}