2015-04-23 52 views
2

我完成了spritekit游戏,但没有强大的参考周期知识。我没有任何崩溃或明显的问题,但使用工具我可以看到我的对象被保留在每个级别之间(SKScene应该在各级之间进行处理)。Swift/SpriteKit - 无法打破强大的参考周期

这里是我的一般游戏的部分:

GameConfig静态结构

我有一个全局可访问的静态结构,引用我的视图控制器。我从整个应用程序使用这个结构访问viewController。我给你GameConfig.viewController = self了的viewController的viewDidLoad

GameViewController

在这里我引用我的SKScene,并SKView这样

var skView: MyView! 
weak var scene: SKScene! 

BaseScene

这是我的基地SKScene类的内。这是获取类本身

let indicators: Indicators = Indicators() 

KillSceneBaseScene

在我BaseScene子类的子类的引用这个类的唯一属性,我已经包含在阵列中许多自定义子类。这些自定义子类可以引用场景,但场景并不直接引用它们。它只能引用它们的容器数组。例如:

var radarBlips: [RadarBlip] = [] 

我有具有与KillScene

var ship: KillShip = KillShip() 

在我的两个IndicatorsKillShip类很强的参考周期的一个特性,我已经使用weak关键字引用我的场景。

事实上,我已经找到了我参考场景的每个实例,并且在其前面放置了weak

我试图做一个精简的游戏,并在精灵和场景之间创建一个强大的引用循环,然后打破它。我成功地这样做了。但我似乎无法调试我自己的游戏。

任何详细的建议将是有帮助的。我知道在周围传球时会有一些技巧。也许这跟它有关系?任何我能找到的建议都会很棒。我已将weak放在比我需要的地方更多的地方。

我不能让现场deinit

+0

当我使用精灵套件进行强大的参考周期时,要么是因为我忘记将“weak”添加到保存对其父节点的引用的节点。或者,我通过在闭包中不使用'[无主自我]'或'[弱自我]'来创建一个强大的参考周期。 – ABakerSmith

+0

你可以扩大关闭。我没有真正考虑过这一点。也许链接我一个很好的参考? – hamobi

+0

看看这个:http://blog.xebia.com/2014/10/09/function-references-in-swift-and-retain-cycles/然后,我建议通过您创建的任何关闭并确保你没有创建任何强大的参考周期。 – ABakerSmith

回答

0

有没有一种简单的方法来做到这一点。检查所有引用彼此的属性,并使用弱或无主。 spritekit中更大的问题是检查闭包。当你运行延迟关闭(在SKActions)和类似的事情时,在关闭中使用[weak self]是非常重要的,所以它不会让对象保持活动状态。在强壮的参考周期被破坏之前,添加更多的弱点和不需要的非常容易,然后用后退的方式删除不必要的参数。