如何释放未使用的 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
中有一些东西保留了它。
因此,通过删除其中的所有内容,我们消除了保留循环。
此解决方案并不总是有效,只有当 SKActions
或 SKNodes
之一保留 SKScene
时才会有效,这是您的问题情况下,但是您的 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
中有一些东西保留了它。
因此,通过删除其中的所有内容,我们消除了保留循环。
此解决方案并不总是有效,只有当 SKActions
或 SKNodes
之一保留 SKScene
时才会有效,这是您的问题情况下,但是您的 SKScene
可能会从其他地方保留下来,这个答案对您没有真正的帮助