Xcode 中的断点
此异常可能并不表示您设置了断点,但这里为不熟悉的人提供了一个概述。
在 Xcode 中,断点是指向用于调试目的的代码行的对象。在代码编辑器中,单击行号会向该行添加一个断点。断点(通常为蓝色)看起来像行号上的小箭头矩形。当你运行你的程序并且那行代码被执行时,程序会崩溃,并且 lldb(Apple 的调试器)会为你提供有关该范围内变量的信息。这对于查看某些变量中存储的内容以及检查代码块是否正在执行很有用。通过在断点上执行辅助(右键)单击并选择“编辑断点”,开发人员可以选择高级选项,例如允许在崩溃之前执行一定次数。
当您单击按钮时,该块中的代码正在执行,断点被命中,程序中止。这可能不是你设置的断点,而是内部的。
要删除断点,请执行第二次(右键)单击并选择“删除断点”。或者,您可以选择禁用它。这会将其淡出。
您可以在Breakpoint Navigator 中查看断点概览。
内部断点
这个特定的断点指示 ARM,因此让我认为它是 ARM 处理器的内部断点。在内部,iOS 可能会提供断点,即使您没有设置它们。
32 位与 64 位
我的猜测是您的 random() 函数在某个地方生成了一个 64 位整数,这可能会导致旧的 32 位设备崩溃。
大大简化,32 位和 64 位设备之间的区别在于内存。在内部,当您创建任何类型的变量或常量时,您就是在设备的内存中存储一些东西。 64 位处理器能够访问比 32 位处理器更多的内存。此外,64 位应用程序包含 64 位数据类型。
许多 Swift 数据类型明确定义了它们自身的不同版本,它们是不同的位大小。例如,Swift 整数有 Int8、Int16、Int32 和 Int64,以及相同的无符号版本。在包含 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。