我目前正在与一个或多个AI玩家一起编写一个回合制的SpriteKit游戏。每个AI一次轮到一个,并使用共享的solutionFinder
实例找到自己的解决方案,但在分离的线程中执行此操作,因为它有时需要几秒钟......
[NSThread detachNewThreadSelector:@selector(findSolution:)
toTarget:self.scene.solutionFinder
withObject:self];
...其中self
是当前的AI播放器,scene
是父SKScene
,其中包含{AI}玩家作为孩子的SKNode
。当线程只运行几毫秒时,一切都很好,但是当线程运行几秒钟时,很少我在SKScene
的{{1}中得到一个EXC_BAD_ACCESS异常方法。
我添加了一些引发异常的NSLog,它解除引用包含问题的AI播放器的-(void)update:(CFTimeInterval)currentTime
。但是,记录指针所指向的地址表明它不会从对有效访问的有效访问中更改 - 分离的线程是否可能在线程完成时错误地释放SKNode,或者是否出现其他问题?
NSThread调用的方法包含在SKNode
。
答案 0 :(得分:0)
因此,在尝试了大量的东西,包括malloc gaurds,NSZombie,@ autorelease,GCD,performSelectorInBackground和其他零碎之后,我偶尔会遇到崩溃。
虽然现在已经修好了!在修复之前,包含所有玩家的SKNode作为属性公开并通过需要访问的代码传递,我认为这是问题,因为SpriteKit会不时地从我的脚下扫除事物。现在,需要在类之间共享的任何对象都是通过我自己管理的NSArray共享的,经过数小时的压力测试后问题似乎已经消失了。