我的代码,使用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)
...
我无法重现那次崩溃,所以我必须分析代码的这一行:
begin
已使用begin = [String: Int]()
初始化,因此其类型为[String : Int]
,而sequenceNumber
的类型为UInt16
。所以我认为begin[String(sequenceNumber)]
没有任何潜在的错误。
Int(Date().timeIntervalSince1970 * 1000)
就像Int(aDouble * 1000)
一样,在任何情况下都是正确的。
所以我对崩溃日志感到困惑,有人可以给我一些提示吗?
答案 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)