我正在尝试创建一个路径(CGMutablePath)以用于SpriteKit(SKShapeNode)中的形状节点。我正在运行我的代码,它停止并说EXC_BREAKPOINT,好像编译器中没有断点时(没有断点时)。以下是我所拥有的屏幕截图。

如您所见,我在编译器中没有设置断点。它只是趋向于停在第31行。如果从头开始,日志中没有任何内容可以说明发生此崩溃的原因。

我习惯用Objective-C在日志中将main.mThread 1: SIGABRT停在NSException中,但是这没有任何意义。有人可以解释怎么了吗?

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

最佳答案

之所以会发生这种异常,是因为arc4random()返回UInt32,而您要减去x的值,这可能会导致一个负值,该值不能表示为无符号整数。

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

var y = CGFloat(self.size.height / 3) + CGFloat((Int32)(arc4random() % 100) - 50)

关于上面的CGFloat值-您创建arc4random并仅在此之后减去,因此不会遇到上述情况。因此,以下是不同的修复方法
var y = CGFloat(self.size.height / 3) + CGFloat(arc4random() % 100) - 50

基本上,您必须确保在减去某些内容时没有不带符号的类型。

令人讨厌的事情是,每次arc4random % something返回大于50的值时,编译器都不会警告您,并且代码有时有时实际上可以工作,因此不会漂移到负值...

考虑到您不应该使用arc4random_uniform的反馈和建议,最好的解决方案是使用arc4random % something
arc4random_uniform(something)将不会产生随机值的适当分布,而arc4random会产生-this has already been discussed on SO before

最后一点:您可能应该选择101而不是100作为上限,因为arc4random_uniform和ojit_code都产生介于0和(upper-1)之间的值,例如0和99。如果减去50,则得到的值介于-50和+49之间。选择101将产生-50到+50的期望范围。
var y = CGFloat(self.size.height / 3) + CGFloat(arc4random_uniform(101)) - 50

关于ios - Swift中奇怪的断点异常怎么了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31225008/

10-11 14:55