【问题标题】:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) on swiftEXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) on swift
【发布时间】:2017-04-10 09:14:57
【问题描述】:

我在 SwiftMoment 的这部分代码中遇到了这个问题 https://github.com/akosma/SwiftMoment

public func moment(_ timetoken: Int64) -> Moment {
  return moment(Int(timetoken / 10000))
}

我不确定为什么会这样。如果您有任何见解,请随时分享。 谢谢!

这是时间令牌值: timetoken 14915504189961350

这发生在模拟器上 MacOS Sierra 10.12.4

Xcode 8.3.1 iOS 10.3.1 iPhone 5

更新

iPhone 7 上没有出现该问题

【问题讨论】:

  • 你有完整的堆栈跟踪吗?
  • 我对 xcode 有点陌生。我添加了更多信息。如何共享完整的堆栈跟踪?
  • timetoken 的值是多少?错误发生在哪里? Mac/iOS 设备/模拟器? 32 位还是 64 位平台?
  • 你在模拟哪个设备?
  • 如果 timetoken 是 64 位的,你认为它除以 1000 是否适合 32 位内存?

标签: swift


【解决方案1】:

iPhone 5 是 32 位设备,这意味着Int is a 32-bit integer,而timetoken / 10000 的结果不适合 Int。与其他一些编程语言相比,整数溢出在 Swift 中是一个致命的运行时错误(这很好,因为否则 你只会得到一个错误的结果)。

我建议将值转换为 TimeInterval (这是一个浮点类型,实际上只是Double的一个类型别名)然后调用

public func moment(_ seconds: TimeInterval) -> Moment

而不是

public func moment(_ milliseconds: Int) -> Moment

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 2016-09-24
    相关资源
    最近更新 更多