Swift/SpriteKit-Can';t打破强参考循环

Swift/SpriteKit-Can';t打破强参考循环,swift,memory-leaks,sprite-kit,automatic-ref-counting,Swift,Memory Leaks,Sprite Kit,Automatic Ref Counting,我完成了一个spritekit游戏,但不了解强引用循环。我没有任何崩溃或明显的问题,但使用仪器,我可以看到我的对象被保留在每个级别之间(SKScene应该在级别之间解除分配) 以下是我的游戏的一般部分: GameConfigstatic struct 我有一个全局可访问的静态结构,它引用我的ViewController。我使用此结构从整个应用程序访问viewController。我将GameConfig.viewController=self分配到viewController的viewDidLo

我完成了一个spritekit游戏,但不了解强引用循环。我没有任何崩溃或明显的问题,但使用仪器,我可以看到我的对象被保留在每个级别之间(SKScene应该在级别之间解除分配)

以下是我的游戏的一般部分:

GameConfig
static struct

我有一个全局可访问的静态结构,它引用我的ViewController。我使用此结构从整个应用程序访问viewController。我将
GameConfig.viewController=self
分配到viewController的
viewDidLoad

GameViewController

在这里,我引用了我的SKScene和SKView

var skView: MyView!
weak var scene: SKScene!
基本场景

这是我的基础课。这是该类唯一获得类本身引用的属性

let indicators: Indicators = Indicators()
KillScene
基本场景的子类

在我的BaseSecene子类中,数组中包含许多自定义子类。这些自定义子类确实引用场景,但场景没有直接引用它们。它只引用了它们的容器数组。例如:

var radarBlips: [RadarBlip] = []
我确实有一个属性与
KillScene

var ship: KillShip = KillShip()
在我的
指示器
KillShip
类中,我使用
关键字引用了我的场景

事实上,我已经找到了每一个引用场景的实例,并将
weak
放在它前面

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

任何详细的建议都会有帮助。我知道传递闭包是有诡计的。也许这与此有关?任何关于我可以寻找什么的建议都会很好。我把
放在了比我可能需要的更多的地方


我无法将场景设置为Denit,这不是一个简单的方法。检查所有相互引用的属性,并使用弱属性或无主属性。spritekit中更大的问题是检查闭包。当您运行延迟闭包(在SKActions中)和类似的东西时,在闭包中使用
[weak self]
非常重要,这样它就不会使对象保持活动状态。在强引用循环被打破之前,添加更多的弱引用和无主引用比必要的要容易,然后反向删除不必要的弱引用和无主引用。

当我使用sprite kit进行强引用循环时,可能是因为我忘记将
添加到保留对其父节点引用的节点。或者,我没有在闭包中使用
[unowned self]
[weak self]
创建了一个强引用循环。您可以扩展闭包吗。我还没有真正调查过。也许可以给我一个好的引用?看看这个:然后我建议你检查一下你创建的所有闭包,确保你没有创建任何强引用循环。我试着强制它。我在游戏中发现了闭包的每一个用法,并将它们修改为使用[弱自我]。。没有变化。还有其他想法吗=/我要做的是直接删除代码(只需注释掉场景),然后继续添加代码位,直到没有调用
deinit
。我恐怕在没有看到任何代码的情况下,我帮不了你多少忙。祝你好运