【问题标题】:App runs on Simulator, not on device应用程序在模拟器上运行,而不是在设备上
【发布时间】: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 &gt;= month &amp;&amp; month &lt;= 12);NSParameterAssert(1 &gt;= day &amp;&amp; day &lt;= 31);。此外,将年份设为有符号,而将月份和日期设为无符号似乎有点奇怪。
  • 这是有道理的,因为我们在第 0 年之前有几年,但我们没有负月份或天数

标签: ios date device


【解决方案1】:

我猜你在这段代码中会收到一些 64 位警告。

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

CFCalendarDecomposeAbsoluteTime 的文档说:“所有单位的类型都是 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];
}

【讨论】:

  • 非常感谢。我什至不知道从哪里开始思考。这是否意味着模拟器不能运行在 64 位模式下?
  • @Sjakelien 是的,模拟器可以在 64 位模式下运行。这完全取决于项目设置,这是一个非常不同的问题。
【解决方案2】:

顺便说一句,很高兴你解决了你的问题,除了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];
}

【讨论】:

    猜你喜欢
    • 2020-02-17
    • 2012-07-30
    • 1970-01-01
    • 2012-01-01
    • 2012-12-25
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多