Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 应用程序持续崩溃,由于未捕获的异常而终止应用程序';NSInvalidArgumentException';_Ios_Swift_Game Physics - Fatal编程技术网

Ios 应用程序持续崩溃,由于未捕获的异常而终止应用程序';NSInvalidArgumentException';

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

我正在创建一个游戏,其中随机物体落在随机的地方,有一个球有一个固定的y轴,并沿着x轴不断移动,它必须移动并投掷物体,我试图计算分数,我这样做的方式是我创建了一个物理物体,它与球在同一y轴上,当对象发生碰撞时,应该调用score函数并将分数增加1,但由于某些原因,应用程序不断崩溃,它给了我这个错误

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)