我目前在代码中有一个很强的参考周期,在内存图中看起来像这样:
我已经滤除了我遗漏[弱自我]的可能性,并且我相信这是所显示的闭合所捕获的另一个实例(闭合#3,它反复出现在与之相关的泄漏SKSpriteNodes中我的“圈子”课程)。
我在各个地方的闭包中都捕获到了Circle类型的圈子。例如:
let sprite = circle.sprite!
let changeTextureAction = SKAction.run
{
sprite.texture = newTexture
if circle.bonusCircleType == .bonus4 || circle.bonusCircleType == .bonus2x
{
let oldArrowSprite1 = sprite.childNode(withName: "arrowSprite1")
oldArrowSprite1?.removeFromParent()
let oldArrowSprite2 = sprite.childNode(withName: "arrowSprite2")
oldArrowSprite2?.removeFromParent()
let (arrowSprite1, arrowSprite2) = getArrowSprites(circle)
sprite.addChild(arrowSprite1)
sprite.addChild(arrowSprite2)
sprite.removeAction(forKey: "animateCircle")
}
else if circle.bonusCircleType == .bomb
{
let bombLeftEmitter = sprite.childNode(withName: "bombLeftEmitter")
bombLeftEmitter?.isPaused = false
let bombRightEmitter = sprite.childNode(withName: "bombRightEmitter")
bombRightEmitter?.isPaused = false
let bombTopEmitter = sprite.childNode(withName: "bombTopEmitter")
bombTopEmitter?.isPaused = false
}
}
sprite.run(SKAction.sequence([SKAction.wait(forDuration: time), SKAction.group([changeTextureAction, expandUpAction, Assets.sharedInstance.fxMatch4]), expandDownAction2]), withKey: "animateNewBonusCircle")
对于我来说,有没有一种好的方法可以避免闭合引起的强力捕获,而又不会将其捕获为无主或弱的呢?可能在关闭之前将圆重新分配,在这种情况下,我会发生崩溃(或以弱弱的舞步发生,但我想发生的事情却没有发生-假设我还有其他要执行的功能)使用圆圈的位置,即使它可能刚刚被移除)。
我最初的想法是我可以用可以设置为弱的相同属性替换另一个对象,但是不确定管理该对象的语法。
下面是我的分配数据的屏幕快照,如果它给任何人提供了我正在处理的内容的线索。我对添加地图标头的调用感到怀疑,并且分配引用它使用了542 mb的内存,但是当我删除它时,似乎并没有恢复太多的内存使用量。我的猜测是这仅仅是我的资产单例被调用的第一个实例,其中包含游戏的纹理图集。现在,我在考虑也许由于某些原因地图集本身由于某种原因没有被释放,但是我实际上是在代码中手动将其分配。啊任何想法表示赞赏。