我正在尝试创建一个路径(CGMutablePath)用于SpriteKit(SKShapeNode)中的形状节点.我正在运行我的代码,它停止并说EXC_BREAKPOINT就像编译器中有一个断点,当没有断点时.下面是我所拥有的截图.
如您所见,我在编译器中没有设置断点.它只是倾向于停在第31行.日志中没有任何内容可以解释此崩溃的原因,如果有一个开始的话.
我习惯于在main.m中使用Thread 1:SIGABRT和日志中的NSException停止Objective-C,但这没有任何意义.有人可以解释一下是什么问题吗?
编辑:这里有更多的截图,以证明我没有设置断点.当我得到一个异常时,它只会抛出一个断点.
解决方法
发生这种异常是因为arc4random()返回了UInt32并且你正在减去它的值,这可能导致负值,这不能表示为无符号整数.
要解决此问题,您可能希望在减去以下之前将表达式强制转换为Int32:
var y = CGFloat(self.size.height / 3) + CGFloat((Int32)(arc4random() % 100) - 50)
关于上面的x值 – 您创建CGFloat并且仅在此之后减去,因此不会遇到上述情况.因此,不同的解决方案如下
var y = CGFloat(self.size.height / 3) + CGFloat(arc4random() % 100) - 50
你基本上必须确保在你减去某些东西时你没有无符号类型.
令人烦恼的是,编译器没有警告你,并且代码实际上有时会工作,每当arc4random返回大于50的东西时,因此不会漂移到负值…
结合反馈和建议你不应该使用arc4random%,最好的解决方案是使用arc4random_uniform.
arc4random%something不会产生随机值的正确分布,而arc4random_uniform(某事)确实 – this has already been discussed on SO before.
最后一点:你可能应该选择101作为上限而不是100,因为arc4random和arc4random_uniform都会产生一个介于0和(upper-1)之间的值,例如: 0和99.如果减去50,则得到介于-50和49之间的值.选择101将得到-50到50的所需范围.
var y = CGFloat(self.size.height / 3) + CGFloat(arc4random_uniform(101)) - 50