什么与Swift中奇怪的断点异常有关?

DDP*_*AGE 6 ios swift

我正在尝试将一个path(CGMutablePath)用于SpriteKit(SKShapeNode)中的形状节点.我正在运行我的代码,它停止并说EXC_BREAKPOINT好像编译器中有一个断点,当没有断点时.下面是我所拥有的截图.

截图

如您所见,我在编译器中没有设置断点.它只是倾向于停在第31行.日志中没有任何内容可以解释此崩溃的原因,如果有一个开始的话.

我习惯于使用Objective-C 和日志main.m一起停止,但这没有任何意义.有人可以解释一下是什么问题吗?Thread 1: SIGABRTNSException

编辑:这里有更多的截图,以证明我没有设置断点.当我得到一个异常时,它只会抛出一个断点.

控制台日志

UI

luk*_*302 6

发生异常是因为arc4random()返回UInt32并且您正在减去该值,这可能会导致负值,这不能表示为无符号整数.

要解决此问题,您可能希望在减去以下之前将表达式强制转换为Int32:

var y = CGFloat(self.size.height / 3) + CGFloat((Int32)(arc4random() % 100) - 50)
Run Code Online (Sandbox Code Playgroud)

关于x上面的值 - 您创建CGFloat并且仅在此之后减去,因此不会遇到上述情况.因此,不同的解决方案如下

var y = CGFloat(self.size.height / 3) + CGFloat(arc4random() % 100) - 50
Run Code Online (Sandbox Code Playgroud)

你基本上必须确保在你减去某些东西时你没有无符号类型.

令人讨厌的是,编译器没有警告你,并且代码实际上有时会工作,每次arc4random返回大于50的东西时都不会漂移到负值...

结合您不应使用arc4random % something最佳解决方案的反馈和建议将是使用arc4random_uniform.

arc4random % something不会产生随机值的适当分布,同时arc4random_uniform(something)- 这已经在SO之前讨论过了.

最后要注意的:你应该选择101作为上限,而不是100,因为这两个arc4random以及arc4random_uniform产生0和(上-1),例如0-99如果减去50之间的值,你会得到-50之间的值+ 49.选择101将产生-50至+50的期望范围.

var y = CGFloat(self.size.height / 3) + CGFloat(arc4random_uniform(101)) - 50
Run Code Online (Sandbox Code Playgroud)

  • @DDPWNAGE请参阅http://stackoverflow.com/questions/2611607/are-exc-breakpoint-sigtrap-exceptions-caused-by-debugging-breakpoints.`EXC_BREAKPOINT`不是由断点引起的.这只是一次崩溃.可能是一个凸起的例外. (3认同)
  • 另外:用`arc4random_uniform(100)`替换`arc4random()%100`. (3认同)