【问题标题】:Xcode: EXC_BREAKPOINT (EXC_ARM_BREAKPOINT, subcode=0xe7ffdefe)Xcode:EXC_BREAKPOINT(EXC_ARM_BREAKPOINT,子代码=0xe7ffdefe)
【发布时间】:2015-06-08 15:58:18
【问题描述】:

我在 iOS7 设备上运行我的应用程序时遇到 EXC_BREAKPOINT (EXC_ARM_BREAKPOINT, subcode=0xe7ffdefe) 错误。 问题是,它在 iOS7 模拟器上运行流畅。

通过使用断点,我发现错误出现在第 6 行。

required init(coder aDecoder: NSCoder) {
    personPicker = ABPeoplePickerNavigationController()
    super.init(coder: aDecoder)
    personPicker.peoplePickerDelegate = self
}
 /*error line*/ @IBAction func BPressed(sender: AnyObject) {
 self.presentViewController(personPicker, animated: true, completion: nil)
}

这个错误是新的,直到我将这些行添加到代码中后才出现在我的设备上;

        let url = NSURL(string: urlPath)
        let request = NSURLRequest(URL: url!)
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
            println(NSString(data: data, encoding: NSUTF8StringEncoding))
        }

还有;调试器将错误指向这一行:

0x16a7f0:  trap 

并在控制台中给出这个输出:

致命错误:尝试从空指针创建非托管实例

即使我在情节提要中没有更改任何内容,此错误也会导致设备出现黑屏。

感谢您抽出宝贵时间。

编辑:这个错误在搜索引擎中显示没有结果,但我认为它可能与obj-c有关。

【问题讨论】:

  • 我得到了完全相同的错误(包括子代码),但我在控制台中没有看到任何内容。它在我的 iPhone 6 上运行良好,但在我的 4S 和 iPod Touch 上崩溃。在模拟器和实际设备上似乎都是这种情况。对我来说有问题的行是对坐标数组(它是 x 和 y Ints 的结构)的追加调用。
  • 您是否在代码中的任何位置使用 Int(或任何其他数据类型),该值可能会获得如此大的值以至于您有点溢出?正如我所说,我只在 4S 和 iTouch(32 位设备)上遇到了问题,但它在我的 iPhone 6 上运行良好。嗯,我使用普通 Ints 来存储来自 arc4random() 的值。将其更改为 UInt32 解决了我的问题。 stackoverflow.com/questions/28177192/…
  • 确实是一个不错的视角。但是ios模拟器不是模拟32位的吗?我的代码实际上使用了很多变量,但是 int 的最大值是 13 位,string 的最大值是 40。
  • 那不是问题吗?我的理解是,32 位设备上的 Int 最多只能存储 2^31 或 2 147 483 648 的值,即 10 位数字。尝试在其中存储 13 位数字会导致位溢出(或在 Swift 中明显崩溃)。如果你使用 Int64 或 UInt64 会发生什么?是的,我相信模拟器确实模拟了 32 位,这就是它崩溃的原因。
  • 我将使用您建议的变量类型更改这些变量类型。在iOS7模拟器上运行流畅,在iOS7 4S设备上崩溃。

标签: ios objective-c xcode swift breakpoints


【解决方案1】:

我今天在针对运行 iOS 8.1.3 的旧 iPad 2(我认为是 iPad 2——型号为 MD368LL/A)测试一些 Swift 代码时遇到了这个问题。结果发现问题无处不在,我称之为:

Int(arc4random() % <someInt>)

这在后来的 iPad、iPhone5S、iPhone6 等上运行良好。通过将代码更改为:

Int(UInt32(arc4random()) % UInt32(<someInt>))

我认为这是旧硬件上的寄存器溢出。

【讨论】:

  • 对我们来说完全相同的问题:在旧设备上执行 String(intA + intB) 时崩溃。明确标记为 UInt32 修复。
【解决方案2】:

在我的情况下,如果您将太大的数字转换为太小的类型,这最终会导致位溢出问题。例如。 Int(someNumber) 如果 someNumberInt64 类型。

iPhone 5c 在有问题的代码行中断:

【讨论】:

    【解决方案3】:

    我在iPhone 5中遇到了这个问题,即iOS 10.3.3

    let date = Date()
    // Crashes in `iPhone 5`, but works in `iPhone 5s`.
    let time: Int = 1000 * Int(date.timeIntervalSince1970) //< Crash due to cast `Double` to `Int`
    
    // This crashes in `iPhone 5`, and `iPhone 5s` too.
    let time: Int32 = 1000 * Int32(date.timeIntervalSince1970)
    
    // It works fine in `iPhone 5`, and `iPhone 5s`.
    let time: Int64 = 1000 * Int64(date.timeIntervalSince1970)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 2015-06-20
      • 2016-02-19
      • 1970-01-01
      相关资源
      最近更新 更多