为什么此代码在 iPhone 5 上崩溃?
Why this code crashes on iPhone 5?
以下代码:
func getCurrentMillis() -> Int64 {
return Int64(Date().timeIntervalSince1970 * 1000)
}
在 [32 位] iPhone 5 上崩溃,消息为:
EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xe7ffdefe)
我不明白为什么这个计算的结果似乎应该适合 Int64
,或者我错过了什么?
Stacktrace 显示此(TextProcessor.textDidChange()
调用 getCurrentMillis()
):
应OOPer的要求,我添加了TextProcessor的相关代码:
var timeOfLastInput: Int64 = 0
...
if getCurrentMillis() - timeOfLastInput > 150 {
textMap.cursorPosition = nil
}
更新:
我已将错误报告发送给 Apple。
如您所知,您的 iphone 5 在 32 位系统上运行。您想要使用 64 位编码的 Int。其实是配不上的。您的 iphone 无法存储它。
扩展 the_dahiya_boy 的解决方案:Int 大小与 32 位系统上的 Int32 相同,与 64 位系统上的 Int64 大小相同。
我不确定 Swift 编译器中发生了什么,但是当您编写时:
if getCurrentMillis() - timeOfLastInput > 150 {
Swift 在许多重载的减法运算符中使用了这个:
public func -<T : Strideable>(lhs: T, rhs: T) -> T.Stride
(使用 Xcode 8.2.1 测试。)
不幸的是,Int64.Stride
是Int
,所以在32位系统中timeOfLastInput
是0
时,运算结果溢出。
要解决 Swift 的这种行为,您可以将行更改为:
if getCurrentMillis() > timeOfLastInput + 150 {
无论如何,你最好发一个bug report to Apple or to swift.org。
以下代码:
func getCurrentMillis() -> Int64 {
return Int64(Date().timeIntervalSince1970 * 1000)
}
在 [32 位] iPhone 5 上崩溃,消息为:
EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xe7ffdefe)
我不明白为什么这个计算的结果似乎应该适合 Int64
,或者我错过了什么?
Stacktrace 显示此(TextProcessor.textDidChange()
调用 getCurrentMillis()
):
应OOPer的要求,我添加了TextProcessor的相关代码:
var timeOfLastInput: Int64 = 0
...
if getCurrentMillis() - timeOfLastInput > 150 {
textMap.cursorPosition = nil
}
更新: 我已将错误报告发送给 Apple。
如您所知,您的 iphone 5 在 32 位系统上运行。您想要使用 64 位编码的 Int。其实是配不上的。您的 iphone 无法存储它。
扩展 the_dahiya_boy 的解决方案:Int 大小与 32 位系统上的 Int32 相同,与 64 位系统上的 Int64 大小相同。
我不确定 Swift 编译器中发生了什么,但是当您编写时:
if getCurrentMillis() - timeOfLastInput > 150 {
Swift 在许多重载的减法运算符中使用了这个:
public func -<T : Strideable>(lhs: T, rhs: T) -> T.Stride
(使用 Xcode 8.2.1 测试。)
不幸的是,Int64.Stride
是Int
,所以在32位系统中timeOfLastInput
是0
时,运算结果溢出。
要解决 Swift 的这种行为,您可以将行更改为:
if getCurrentMillis() > timeOfLastInput + 150 {
无论如何,你最好发一个bug report to Apple or to swift.org。