【问题标题】:iOS Swift - EXC_BAD_INSTRUCTION on certain devicesiOS Swift - 某些设备上的 EXC_BAD_INSTRUCTION
【发布时间】:2015-02-05 13:00:39
【问题描述】:

我对 Swift 和 iOS 开发非常陌生,但我遇到了一个错误,导致我的应用在以下设备上运行时崩溃:

iPhone 4S iphone 5 平板电脑 2 iPad 视网膜

这是被标记的代码:

// bin2dec - converts binary string into decimal string
func bin2dec(input: String) -> String {
    var counter = countElements(input)
    var digit: Character
    var power = 1
    var result = 0

    while counter > 0 {
        digit = input[advance(input.startIndex, counter-1)]

        switch digit {
        case "0":
            result += 0
        case "1":
            result += 1 * power
        default:
            power = power / 2
            break
        }
        counter--
        power *= 2
    }
    return "\(result)"
}

错误是:

Thread 1: EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0)

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 什么输入会杀死它,在哪一行?
  • 哦,是的,当然,在 switch 里面,case "0": 并且当它接收到一个完整的 32 位字符串时,例如(1111111111111111111111111111111)

标签: ios swift crash exc-bad-instruction


【解决方案1】:

iPhone 4S、iPhone 5、iPad 2、iPad Retina 是 32 位设备,其中Int 是一个 32 位整数。因此从

开始
var power = 1

然后调用

power *= 2

32 次会溢出并引发异常。在 Swift 中,整数算术不会像 (Objective-)C 中那样默默地“环绕”, 除非您明确使用“溢出运算符”&*&+ 等。

可能的解决方案:

  • 使用Int64 而不是Int
  • 避免power的最终乘法(其结果不是 需要)。

请注意,有更简单的方法可以转换二进制字符串 数字转换为数字,例如参见How to convert a binary to decimal in Swift?

【讨论】:

  • 可能还值得注意的是,在当前的 64 位设备上,问题仍然存在,但字符串长度是原来的两倍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2020-05-22
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多