为什么此代码在iPhone 5上崩溃?

时间:2017-02-09 09:43:10

标签: ios iphone swift crash 32-bit

以下代码:

func getCurrentMillis() -> Int64 {
    return Int64(Date().timeIntervalSince1970 * 1000)
}

在[32位] iPhone 5上崩溃并显示消息:

EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xe7ffdefe)

我不明白为什么这个计算结果似乎适合Int64,或者我错过了什么?

Stacktrace会显示此信息(TextProcessor.textDidChange()来电getCurrentMillis()):

enter image description here

根据OOPer的请求,我添加了TextProcessor的相关代码:

var timeOfLastInput: Int64 = 0

...

if getCurrentMillis() - timeOfLastInput > 150 {
    textMap.cursorPosition = nil
}

更新 我已经向Apple发送了错误报告。

2 个答案:

答案 0 :(得分:3)

我不确定Swift编译器中发生了什么,但是当你写:

if getCurrentMillis() - timeOfLastInput > 150 {

Swift在许多重载的减法运算符中使用了这个:

public func -<T : Strideable>(lhs: T, rhs: T) -> T.Stride

(使用Xcode 8.2.1测试。)

不幸的是,Int64.StrideInt,因此当32位系统中timeOfLastInput0时,操作结果会溢出。

要解决Swift的这种行为,您可以将行更改为:

if getCurrentMillis() > timeOfLastInput + 150 {

无论如何,您最好发送bug report to Appleto swift.org

答案 1 :(得分:-2)

如您所知,您的iphone 5在32位系统上运行。您想使用64位的Int编码。实际上,它无法比拟。你的iphone无法存储它。

扩展the_dahiya_boy的解决方案:在32位系统上,Int大小与Int32相同,并且与64位系统上的Int64大小相同。

Reference