Ios 应用程序持续崩溃,由于未捕获的异常而终止应用程序';NSInvalidArgumentException';
我正在创建一个游戏,其中随机物体落在随机的地方,有一个球有一个固定的y轴,并沿着x轴不断移动,它必须移动并投掷物体,我试图计算分数,我这样做的方式是我创建了一个物理物体,它与球在同一y轴上,当对象发生碰撞时,应该调用score函数并将分数增加1,但由于某些原因,应用程序不断崩溃,它给了我这个错误Ios 应用程序持续崩溃,由于未捕获的异常而终止应用程序';NSInvalidArgumentException';,ios,swift,game-physics,Ios,Swift,Game Physics,我正在创建一个游戏,其中随机物体落在随机的地方,有一个球有一个固定的y轴,并沿着x轴不断移动,它必须移动并投掷物体,我试图计算分数,我这样做的方式是我创建了一个物理物体,它与球在同一y轴上,当对象发生碰撞时,应该调用score函数并将分数增加1,但由于某些原因,应用程序不断崩溃,它给了我这个错误 2015-07-13 01:23:17.242 WalkRun[26792:3773366] *** Terminating app due to uncaught exception 'NSInval
2015-07-13 01:23:17.242 WalkRun[26792:3773366] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attemped to add a SKNode which already has a parent: <SKSpriteNode> name:'(null)' texture:[<SKTexture> 'shortwall' (60 x 60)] position:{30, 768} size:{60, 60} rotation:0.00'
*** First throw call stack:
(
0 CoreFoundation 0x00000001073c33f5 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x00000001092eabb7 objc_exception_throw + 45
2 CoreFoundation 0x00000001073c332d +[NSException raise:format:] + 205
3 SpriteKit 0x0000000107ebfaf6 -[SKNode addChild:] + 111
4 WalkRun 0x00000001071c8c44 _TFC7WalkRun9PlayScene10leftObjectfS0_FT_T_ + 2868
5 WalkRun 0x00000001071c7ddc _TFC7WalkRun9PlayScene10randObjectfS0_FT_T_ + 236
6 WalkRun 0x00000001071c8102 _TToFC7WalkRun9PlayScene10randObjectfS0_FT_T_ + 34
7 Foundation 0x0000000107a39fd4 __NSFireTimer + 83
8 CoreFoundation 0x000000010732b4e4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
9 CoreFoundation 0x000000010732b0a5 __CFRunLoopDoTimer + 1045
10 CoreFoundation 0x00000001072ee3dd __CFRunLoopRun + 1901
11 CoreFoundation 0x00000001072eda06 CFRunLoopRunSpecific + 470
12 GraphicsServices 0x000000010e7569f0 GSEventRunModal + 161
13 UIKit 0x0000000108046550 UIApplicationMain + 1282
14 WalkRun 0x00000001071d54ce top_level_code + 78
15 WalkRun 0x00000001071d550a main + 42
16 libdyld.dylib 0x0000000109ad9145 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
该错误表明您正试图在节点已有父节点的情况下将子节点添加到节点中。堆栈跟踪将指向leftObject方法。在这里,您有一个SKAction设置,可以在一个时间间隔内移动,然后从父级删除
var moveObjects = SKAction.moveByX(0, y: -self.frame.size.height * 2, duration: NSTimeInterval(self.frame.size.height / 100))
var removeObjects = SKAction.removeFromParent()
var moveAndRemoveObjects = SKAction.sequence([moveObjects,removeObjects])
bigWall.runAction(moveAndRemoveObjects)
这会将操作添加到节点并运行,但您的代码路径将继续到
movingObjects.addChild(bigWall)
几乎立刻。看起来像是一种竞争条件,在这种情况下,您认为代码将等到操作完成运行后再继续。您有一个名为bigWall的实例属性,在大多数方法中,您创建了一个名为bigWall的局部对象,并将其添加到场景中。因为每次调用方法时它都是一个新对象,所以效果很好。但是,在方法leftObject中,您没有本地对象bigWall,因此它引用的是实例属性。第一次调用leftObject时,将实例属性bigWall添加到场景中可以正常工作。第二次调用该方法时,它将尝试将bigWall实例属性添加到场景中,而该属性已在场景中,这将导致错误。为类和方法变量使用不同的名称。bigWall和tallWall是类变量,因此不要使用相同的变量名初始化新实例。
movingObjects.addChild(bigWall)