我在GameViewController中设置了一个SKScene对象。我将dealloc
实现到SKScene子类中,如下所示:
- (void)dealloc {
NSLog(@"Dealloc: %@", self);
}
现在我想在GameViewController之上呈现另一个视图控制器。我使用storyboard segue来做到这一点。但是在呈现新的视图控制器之后,我从未收到过SKScene dealloc。它被困在记忆中。由于内存不足,我的应用程序在几分钟后开始冻结。如何在呈现新视图控制器后释放场景。
答案 0 :(得分:4)
为了解除分配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
方法并 ARC ,您就不必删除[skView presentScene:nil];
中的所有内容会照顾它。
显然你在SKScene
内有一些保留它的东西。
因此,通过从中删除所有内容,我们消除了保留周期。
此解决方案并不总是有效,只有当SKActions
或SKNodes
中的某个人保留SKScene
时才会有效,但您的问题仍然存在SKScene
可以从其他地方保留,这个答案对你没有帮助