【问题标题】:Thread 1:EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xe7ffdefe) Swift SpriteKit Error线程 1:EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xe7ffdefe) Swift SpriteKit 错误
【发布时间】:2016-01-02 03:07:57
【问题描述】:

单击我的 SKNode(SpriteKit 按钮)时出现此错误:线程 1:EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xe7ffdefe)

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {

    for touch: AnyObject in touches {

        let location = touch.locationInNode(self)

        if playButton.containsPoint(location) {

            random()

        }
    }
}

【问题讨论】:

    标签: swift sprite-kit


    【解决方案1】:

    Xcode 中的断点

    此异常可能并不表示您设置了断点,但这里为不熟悉的人提供了一个概述。

    在 Xcode 中,断点是指向用于调试目的的代码行的对象。在代码编辑器中,单击行号会向该行添加一个断点。断点(通常为蓝色)看起来像行号上的小箭头矩形。当你运行你的程序并且那行代码被执行时,程序会崩溃,并且 lldb(Apple 的调试器)会为你提供有关该范围内变量的信息。这对于查看某些变量中存储的内容以及检查代码块是否正在执行很有用。通过在断点上执行辅助(右键)单击并选择“编辑断点”,开发人员可以选择高级选项,例如允许在崩溃之前执行一定次数。

    当您单击按钮时,该块中的代码正在执行,断点被命中,程序中止。这可能不是你设置的断点,而是内部的。

    要删除断点,请执行第二次(右键)单击并选择“删除断点”。或者,您可以选择禁用它。这会将其淡出。

    您可以在Breakpoint Navigator 中查看断点概览。

    内部断点

    这个特定的断点指示 ARM,因此让我认为它是 ARM 处理器的内部断点。在内部,iOS 可能会提供断点,即使您没有设置它们。

    32 位与 64 位

    我的猜测是您的 random() 函数在某个地方生成了一个 64 位整数,这可能会导致旧的 32 位设备崩溃。

    大大简化,32 位和 64 位设备之间的区别在于内存。在内部,当您创建任何类型的变量或常量时,您就是在设备的内存中存储一​​些东西。 64 位处理器能够访问比 32 位处理器更多的内存。此外,64 位应用程序包含 64 位数据类型。

    许多 Swift 数据类型明确定义了它们自身的不同版本,它们是不同的位大小。例如,Swift 整数有 Int8Int16Int32Int64,以及相同的无符号版本。在包含 32 位处理器的设备上使用 Int64 将尝试在 32 位内存位置存储 64 位整数。您应该小心未标记的Int 类型,它实际上是设备可以容纳的最大Int 的类型别名。如果您尝试将Int64 转换为Int32,您将收到错误消息。在 32 位设备上,由于 Int 将是 Int32,将 Int64 转换为 Int 将导致错误,因为您实际上是将 Int64 转换为 Int32

    在较旧的设备上,您可能会以某种方式生成一个对于 32 位处理器来说太大的整数,并且由于在这些较旧的设备上 Int 确实是 Int32,您会在 Objective-c 中得到缓冲区溢出,但斯威夫特将其推向崩溃。基本算术运算符默认不允许这些类型溢出。

    iPhone 5s 和 iPad Air 中的 Apple A7 处理器是第一款用于 Apple 移动设备的 64 位芯片。较旧的设备无法很好地处理 64 位数据类型。请注意,第 5 代 iPod touch 包含 A5 处理器且仅为 32 位,而第 6 代 iPod 包含 A8 处理器且为 64 位。

    在您的random() 函数中,您应该检查任何可能返回Int64 然后强制转换为Int 的随机数生成函数。您可能还尝试添加两个Int32s,这可能会溢出Int。 (但您仍然可以将其存储在 Int64 中。)

    简而言之,确保生成的数字永远不会大于数据类型可以存储的位数。请记住,您可以在 32 位设备上使用 Int64,但您需要确保不要尝试转换为 Int,这将是 Int32

    请参阅此similar StackOverflow question

    【讨论】:

    • 谢谢!这解决了我以后可能遇到的很多问题!
    • 我更正了一些可能误导的地方。 Int 基本上是设备可以存储的最大整数的类型别名。它可以是任一位大小。该错误可能是由于某处生成的数字对于设备而言可能太大而导致的缓冲区溢出(如果 Swift 没有阻止它)。例如,添加到 Int32s 在 32 位设备上是绝对安全的。
    • 也只是更正了一些关于 Swift Int 类型的使用和其他错误原因的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多