Как мне избежать сильного референтного цикла, когда мне нужна сильная референция в закрытии? - PullRequest
0 голосов
/ 29 января 2019

В настоящее время в моем коде имеется сильный цикл ссылок, который на графике памяти выглядит следующим образом:

strong reference cycle

Я отфильтровал вероятность того, что ямне не хватает [слабого я], и я считаю, что это еще один экземпляр, который захватывается показанным замыканием (замыкание № 3, которое снова и снова появляется в просочившихся узлах SKSpriteNode, относящихся к моему классу «Круг»).

У меня есть круги типа Круг, захваченные в замыканиях в разных местах.Например:

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 МБ памяти, но когда я его удалил, это, похоже, не восстановило мне много использования памяти.Я предполагаю, что это был только первый экземпляр, в котором был назван синглтон моего актива, который содержит атласы текстур для моей игры.Теперь я думаю, что, возможно, сами атласы по какой-то причине не освобождены, но я фактически вручную освобождаю их в коде.Argh.Любые мысли приветствуются.

enter image description here

...