我遇到了一些内存泄漏,这些泄漏似乎与闭包捕获变量有关,而不一定是代码中众所周知的“自我保持周期”。我的问题尤其与SKAction运行块有关,例如
let initialBlock = SKAction.run {
[unowned self] in
emitter.position = self.circlesLayer.convert(circle.currentPosition, to: self)
emitter.zPosition = 150
emitter.isPaused = true
self.addChild(emitter)
}
随后将其用作:
run(SKAction.sequence([SKAction.wait(forDuration: 0.25), initialBlock, emitterStart, SKAction.wait(forDuration: 1.0), emitterStop]))
在这里,我在短暂的延迟后添加了一个发射器,将其取消暂停(emitterStart),等待,然后将其删除(emitterStop)。
为了进一步详细说明,发射器声明为:
let emitter = Assets.sharedInstance.getEmitter(.specialcircleexplosion)
其中Assets是一个单例,它会吸引特定的目标发射器,因为我将它们预加载到游戏场景中。
为了进一步阐述(对不起),circle也是另一个类的实例。我还应该考虑[无名社交圈]吗?
SKAction运行块中是否有任何理由要[弱发射者]或[未拥有的圈子]以及[弱自我]或[未拥有的自我]?这有点双重含义,但从更笼统的意义上讲:除了经典的弱自我案例之外,我是否应该继续观察保留周期?
一些额外的内存图信息,正如我在下面对Rob的评论中所提到的:
这是臭名昭著的闭包#3,但是:
gameScene.animateMatchedCircles() {
[weak self] in self?.animateMatchedCirclesCompletion()
}