我完成了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()
KillScene
的BaseScene
在我BaseScene子类的子类的引用这个类的唯一属性,我已经包含在阵列中许多自定义子类。这些自定义子类可以引用场景,但场景并不直接引用它们。它只能引用它们的容器数组。例如:
var radarBlips: [RadarBlip] = []
我有具有与KillScene
var ship: KillShip = KillShip()
在我的两个Indicators
和KillShip
类很强的参考周期的一个特性,我已经使用weak
关键字引用我的场景。
事实上,我已经找到了我参考场景的每个实例,并且在其前面放置了weak
。
我试图做一个精简的游戏,并在精灵和场景之间创建一个强大的引用循环,然后打破它。我成功地这样做了。但我似乎无法调试我自己的游戏。
任何详细的建议将是有帮助的。我知道在周围传球时会有一些技巧。也许这跟它有关系?任何我能找到的建议都会很棒。我已将weak
放在比我需要的地方更多的地方。
我不能让现场deinit
当我使用精灵套件进行强大的参考周期时,要么是因为我忘记将“weak”添加到保存对其父节点的引用的节点。或者,我通过在闭包中不使用'[无主自我]'或'[弱自我]'来创建一个强大的参考周期。 – ABakerSmith
你可以扩大关闭。我没有真正考虑过这一点。也许链接我一个很好的参考? – hamobi
看看这个:http://blog.xebia.com/2014/10/09/function-references-in-swift-and-retain-cycles/然后,我建议通过您创建的任何关闭并确保你没有创建任何强大的参考周期。 – ABakerSmith