iOS7 SpriteKit在NSThread中花费时间后崩溃



我目前正在与一个或多个AI玩家一起编写一款基于回合的SpriteKit游戏。每个AI一次轮流一个,并使用共享的solutionFinder实例找到自己的解决方案,但这是在分离的线程中完成的,因为有时需要几秒钟。。。

[NSThread detachNewThreadSelector:@selector(findSolution:)
    toTarget:self.scene.solutionFinder 
    withObject:self];

其中self是当前AI玩家,而scene是父SKScene,其包含具有作为子代的AI玩家的SKNode。当线程只运行几毫秒时,一切都很好,但当线程运行几秒钟时,很少我在SKScene-(void)update:(CFTimeInterval)currentTime方法中得到EXC_BAD_ACCESS异常。

我在抛出异常的地方添加了一些NSLogs,问题是取消引用包含AI播放器的SKNode。然而,记录指针指向的地址表明,它不会从有效访问变为无效访问——是否可能是分离的线程在线程完成时错误地释放了SKNode,或者其他问题?

NSThread调用的方法被封装在一个@autorelease中。

所以,在尝试了一大堆东西之后,包括malloc gaurds、NSZombie、@autorelease、GCD、performSelectInBackground和其他零碎的东西,我仍然偶尔会崩溃。

不过现在已经修复了!在修复之前,包含所有玩家的SKNode被暴露为一个属性,并通过需要访问的代码传递,我认为这就是问题所在,因为SpriteKit会不时地从我的脚下扫过东西。现在,任何需要在类之间共享的对象都是通过我自己管理的NSArray共享的,经过几个小时的压力测试,问题似乎已经解决了。

最新更新