为什么“dict [String(aUint16)] = Int(Date()。timeIntervalSince1970 * 1000)”在某些情况下失败了?

时间:2017-05-27 03:15:25

标签: ios swift

我的代码,使用SimplePing

func simplePing(_ pinger: SimplePing, didSendPacket packet: Data, sequenceNumber: UInt16) {
    begin[String(sequenceNumber)] = Int(Date().timeIntervalSince1970 * 1000)//AppDelegate.swift:185
    print("Send: \(Common.startCount)")
}

它在我的模拟器和iPhone中完美运行,但在AppStore上可用之后,我收到了大约20个崩溃日志,其中有一些错误:

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x00000000e7ffdefe
Triggered by Thread:  1
...
Thread 1 name:
Thread 1 Crashed:
0   ME                              0x0011e5cc specialized AppDelegate.simplePing(SimplePing, didSendPacket : Data, sequenceNumber : UInt16) -> () + 652 (AppDelegate.swift:185)
1   ME                              0x00116990 @objc AppDelegate.simplePing(SimplePing, didSendPacket : Data, sequenceNumber : UInt16) -> () + 68
2   ME                              0x00116818 @objc AppDelegate.simplePing(SimplePing, didSendPacket : Data, sequenceNumber : UInt16) -> () + 40
3   ME                              0x000f3348 -[SimplePing sendPingWithData:] + 640 (SimplePing.m:297)
...

我无法重现那次崩溃,所以我必须分析代码的这一行:

开始[字符串(的sequenceNumber)]

<{> begin已使用begin = [String: Int]()初始化,因此其类型为[String : Int],而sequenceNumber的类型为UInt16。所以我认为begin[String(sequenceNumber)]没有任何潜在的错误。

Int(Date()。timeIntervalSince1970 * 1000)

Int(Date().timeIntervalSince1970 * 1000)就像Int(aDouble * 1000)一样,在任何情况下都是正确的。

所以我对崩溃日志感到困惑,有人可以给我一些提示吗?

1 个答案:

答案 0 :(得分:1)

来自Int的文档:

  

在32位平台上,Int与Int32的大小相同,在64位平台上,Int与Int64的大小相同。

带符号的32位整数的最大值为2,147,483,647。

目前,Int(Date().timeIntervalSince1970 * 1000)返回值1,495,855,170,970。

明显大于32位整数。

崩溃是由于在32位iOS设备上运行时将Double强制转换为Int时尝试的溢出造成的。

我建议明确使用Int64代替Int

begin[String(sequenceNumber)] = Int64(Date().timeIntervalSince1970 * 1000)