我的代码,使用 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(日期().timeIntervalSince1970 * 1000)
和Int(Date().timeIntervalSince1970 * 1000)
就像 Int(aDouble * 1000)
一样,在任何情况下似乎都是正确的。
所以我对崩溃日志感到非常困惑,有人能给我一些提示吗?
最佳答案
来自 Int
的文档:
On 32-bit platforms, Int is the same size as Int32, and on 64-bit platforms, Int is the same size as 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)
关于ios - 为什么 "dict[String(aUint16)] = Int(Date().timeIntervalSince1970 * 1000)"在某些情况下会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44212592/