【问题标题】:Swift / SpriteKit - Can't break strong reference cycleSwift / SpriteKit - 无法打破强引用循环
【发布时间】:2015-04-23 01:09:07
【问题描述】:

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

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

GameConfig静态结构

我有一个引用我的 ViewController 的全局可访问的静态结构。我使用这个结构从整个应用程序访问 viewController。我在 viewController 的 viewDidLoad 中分配了 GameConfig.viewController = self

GameViewController

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

var skView: MyView!
weak var scene: SKScene!

BaseScene

这是我的基础 SKScene 类。这是该类的唯一属性,它获取对类本身的引用

let indicators: Indicators = Indicators()

KillSceneBaseScene 的子类

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

var radarBlips: [RadarBlip] = []

我确实有一个属性与KillScene 具有强引用循环

var ship: KillShip = KillShip()

在我的IndicatorsKillShip 类中,我都使用weak 关键字引用了我的场景。

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

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

任何详细的建议都会有所帮助。我知道传递闭包很棘手。也许这与它有关?任何关于我可以寻找的建议都会很棒。我把weak 放在了比我可能需要的地方更多的地方。

我无法将场景发送至deinit

【问题讨论】:

  • 当我使用 sprite-kit 有很强的引用周期时,要么是因为我忘记将 weak 添加到保留对其父节点的引用的节点。或者,我通过在闭包中不使用 [unowned self][weak self] 创建了一个强引用循环。
  • 你能扩展闭包吗?我还没有真正研究过。也许给我一个很好的参考?
  • 看看这个:blog.xebia.com/2014/10/09/… 然后我建议检查你创建的所有闭包,并确保你没有创建任何强引用循环。
  • 我试图暴力破解它。我在我的游戏中发现了闭包的所有用法,并将它们修改为使用 [weak self].. 没有变化。还有其他想法吗? =/
  • 我要做的是立即剥离我的代码(只需将场景注释掉),然后继续添加代码位,直到不调用 deinit。如果没有看到任何代码,恐怕我无能为力。祝你好运!

标签: swift memory-leaks sprite-kit automatic-ref-counting


【解决方案1】:

没有一个简单的方法可以做到这一点。检查所有相互引用的属性并使用弱或无主。 spritekit 中更大的问题是检查闭包。当您运行延迟闭包(在 SKActions 中)和类似的事情时,在闭包中使用 [weak self] 很重要,这样它就不会使对象保持活动状态。在强引用循环被破坏之前,添加更多的weaks和unowned比必要的更容易,然后按照自己的方式向后删除不必要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2014-02-06
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多