ios - 为什么 "dict[String(aUint16)] = Int(Date().timeIntervalSince1970 * 1000)"在某些情况下会失败?

标签 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)
...

我无法重现该崩溃,因此我必须分析该行代码:

开始[字符串(序列号)]

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/

相关文章:

ios - 使用 Swift 3.0 调用 Google Cloud Natural Language API

swift - 在 xcode swift uiscrollview height destination 中需要帮助

swift - 将 Int 转换为 Bool

swift - 在 Swift 中,如何将 int 转换为字符串并反转并显示结果?

ios - 从另一个 View Controller 中的类快速绘制形状(以编程方式)

ios - 带参数的本地化字符串在参数周围添加换行符和括号

ios - 在Swift 3和Xcode 8.0中,UITextViewDelegate方法给出“使用未声明的类型URL”错误

iphone - 检测手指何时被拖动到对象内部(iOS 触摸)

ios - [React Native][IOS] 如何通过通知打开应用程序时捕获事件

iphone - Modal Segue iOS 后同一 TabBarController 的多个实例