【问题标题】:EXC_BAD_INSTRUCTION only in iPhone 5 simulatorEXC_BAD_INSTRUCTION 仅在 iPhone 5 模拟器中
【发布时间】:2016-11-25 19:52:26
【问题描述】:

在 iPhone 5 模拟器上运行我的代码会引发图像中显示的异常。 在任何其他模拟器上运行代码都很好。

我无法发现我在这行不起眼的代码中犯了什么错误。 其他人有这个问题吗?

【问题讨论】:

  • Date()代替NSDate(),结果一样吗?
  • 其实这段代码非常壮观。你为什么在 Swift 中指代 NSInteger?或者,如果这是 Swift 3,到 NSDate?
  • 另外,user! 的意思是“让我崩溃”。即使您认为这不是问题所在,但不检查 user 不是 nil 也是愚蠢的。
  • 另外,我当然希望configureDatabase() 不依赖于您在signInAnonymously 期间所做的任何事情,因为configureDatabaseself.refUsers 被设置之前被执行首先 .
  • @matt 我是 swift 和 ios 开发的新手。阅读博客和stackoverflow我想出了这个。该函数只为数据库更改设置一些侦听器。 Firebase 处理 database() 内部的初始化。感谢用户的提示。我想我将来会改变它。

标签: swift ios-simulator ios10


【解决方案1】:

NSInteger(它是 Swift 中 Int 的类型别名)是 32 位的 32 位平台上的整数,如 iPhone 5。 结果

NSInteger(NSDate().timeIntervalSince1970) * 1000

1480106653342(此时),不适合 范围 -2^31 ... 2^31-1 的 32 位(有符号)整数。 因此 Swift 中止了执行。 (斯威夫特不会“截断” 整数算术运算的结果,因为它在某些情况下完成 其他编程语言,除非您专门使用 “溢出”运算符,例如 &*。)

您可以在所有平台上使用 Int64 进行 64 位计算:

Int64(NSDate().timeIntervalSince1970 * 1000)

在你的情况下,如果需要一个字符串:

let lastLogin = String(Int64(NSDate().timeIntervalSince1970 * 1000))

【讨论】:

  • 不知道 32 与 64 位平台的事情,但我会试一试
  • 感谢您提供有关平台差异的提示。那个让我明白了为什么它不起作用。使用我们给定的建议对我没有帮助,因为 firebase 首先不喜欢典型的 Int64。为了获得自 Epoc(1970) 以来的毫秒数,我想出了 round(NSDate().timeIntervalSince1970 * 1000
  • @Dreanaught:您仍然可以将其转换为字符串,就像您在原始代码中所做的那样,请参阅更新后的答案。
  • 其实没有 原来这个值保存为字符串,而不是我最初想要的数字类型(没有小数位)。
猜你喜欢
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
相关资源
最近更新 更多