如何释放未使用的 SKScene

How to deallocate unused SKScene

我在 GameViewController 中设置了一个 SKScene 对象。我将 dealloc 实现到 SKScene 子类中,如下所示:

- (void)dealloc {
    NSLog(@"Dealloc: %@", self);
}

现在我想在 GameViewController 之上呈现另一个视图控制器。我使用故事板 segue 来做到这一点。但是在呈现新的视图控制器之后,我从未收到 SKScene dealloc。它卡在了记忆中。由于内存不足,我的应用程序在几分钟后开始冻结。如何在呈现新视图控制器后释放场景。

为了释放你的 SKScene 实例 -> 你应该消除保留它的每个指针 -> 然后 ARC 会自动释放它。

只需调用 [skView presentScene:nil]; 方法,该方法也会删除 SCScene 并通过将 SKView.scene 属性 设置为 nil 来释放它。

SKView *skView = (SKView *)self.view; 
GameScene *scene = (GameScene *)skView.scene; 

for(SKNode * child in scene.children)
{
    [child removeAllActions];
}
[scene removeAllChildren];
[scene removeAllActions];
[skView presentScene:nil]; 

注意 通常情况下,如果您的内存管理正确,则不必从 SKScene 中删除所有内容,只需调用 [skView presentScene:nil]; 方法和 ARC 会处理的。

显然您在 SKScene 中有一些东西保留了它。 因此,通过删除其中的所有内容,我们消除了保留循环。

此解决方案并不总是有效,只有当 SKActionsSKNodes 之一保留 SKScene 时才会有效,这是您的问题情况下,但是您的 SKScene 可能会从其他地方保留下来,这个答案对您没有真正的帮助