我目前正在与一个或多个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共享的,经过几个小时的压力测试,问题似乎已经解决了。