当我在封闭中需要强引用时,如何避免强引用周期?

时间:2019-01-29 18:46:30

标签: swift memory-management memory-leaks weak-references

我目前在代码中有一个很强的参考周期,在内存图中看起来像这样:

strong reference cycle

我已经滤除了我遗漏[弱自我]的可能性,并且我相信这是所显示的闭合所捕获的另一个实例(闭合#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的内存,但是当我删除它时,似乎并没有恢复太多的内存使用量。我的猜测是这仅仅是我的资产单例被调用的第一个实例,其中包含游戏的纹理图集。现在,我在考虑也许由于某些原因地图集本身由于某种原因没有被释放,但是我实际上是在代码中手动将其分配。啊任何想法表示赞赏。

enter image description here

0 个答案:

没有答案