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

时间:2015-01-03 12:12:35

标签: ios date device

我有这个代码,我多年来一直在重复使用。今年它破了,我不明白为什么。在我的应用中,我使用日历,即使用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”不喜欢我的设备。

我希望你能帮助我;如果您需要更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:0)

我猜你用这段代码得到了一些64位的警告。

NSInteger year, month, day;
…
CFCalendarDecomposeAbsoluteTime(calendar, absoluteTime, "yMd", &year, &month, &day);

CFCalendarDecomposeAbsoluteTime的文档说,&#34;所有单位的类型都是int。&#34;

在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];
}

答案 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];
}