我在 GameViewController 中设置了一个 SKScene 对象。我将 dealloc
实现到 SKScene 子类中,如下所示:
- (void)dealloc {
NSLog(@"Dealloc: %@", self);
}
现在我想在 GameViewController 之上呈现另一个 View Controller 。我使用 Storyboard segue 来做到这一点。但是在呈现新的 View Controller 之后,我从未收到 SKScene dealloc。它卡在了内存中。由于内存不足,我的应用程序在几分钟后开始卡住。如何在呈现新 View Controller 后释放场景。
最佳答案
为了释放你的 SKScene
实例 -> 你应该消除保留它的每个指针 -> 然后 ARC 将自动释放它。
只需调用 [skView presentScene:nil];
方法,该方法也将删除 SCScene
并通过设置 SKView.scene
属性释放它为零。
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
可以从其他地方保留下来,这个答案不会真正帮助你
关于ios - 如何释放未使用的 SKScene,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35388658/