【问题标题】:Ios popToRootViewControllerAnimated causing Memory IssuesIos popToRootViewController Animated 导致内存问题
【发布时间】:2023-03-09 14:15:01
【问题描述】:

我正在制作我的 SpriteKit 游戏。当玩家死亡时,我的目标是让游戏过渡到开始屏幕。这是通过下面的代码完成的。但是,我注意到每次新游戏开始时内存都会增加。 Xcode Instruments 没有显示内存泄漏。当内存达到大约 150mb 时,游戏帧率下降,游戏变得无法玩。

GameScene中我会在玩家死亡时调用这个函数

func gameOver(){
    if let block = gameOverBlock {
        worldNode.removeAllChildren()
        worldNode.removeAllActions()
        worldNode.removeFromParent()
        self.removeAllChildren()
        block()
    }
}

在 GameViewController 中调用以下函数

     scene!.gameOverBlock = {
        [weak self] in
        self!.goBack()
    }
}

func goBack(){
    scene!.removeFromParent()
    navigationController!.popToRootViewControllerAnimated(false)
    return
}

如果有人对我如何在不发生内存泄漏的情况下实现这一点有任何想法,将不胜感激。

【问题讨论】:

  • 什么是worldNode? SpriteKit 场景?
  • worldNode 只是 gameScene 中的一个 SKNode()。它包含所有游戏元素
  • 我想知道是否存在某种强引用循环。除了第一个之外的所有视图控制器都被取消初始化,也许另一个对象仍然持有指向它的指针,所以它永远不会离开内存,这可以解释你不断增长的内存。祝你好运,这些问题很糟糕。

标签: ios swift memory-leaks sprite-kit


【解决方案1】:

注释掉大量代码后,我发现了问题所在。正如 Matthew 建议的那样,我在上面发布的方法并没有导致泄漏,我的代码中间有一个强引用阻止 ARC 释放内存。生病发布问题代码,以防其他人可能有类似的问题。

在我的 GameViewController 中,我有以下块:

  scene!.zoomInBlock = {
       self.scene!.size = CGSizeMake(self.scene!.size.width / 2, self.scene!.size.height / 2)
    }

正确的写法(不引起强引用)是:

  scene!.zoomInBlock = {
     [unowned self] in self.scene!.size = CGSizeMake(self.scene!.size.width / 2, self.scene!.size.height / 2)
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    相关资源
    最近更新 更多