如何释放未使用的SKScene

时间:2016-02-14 05:24:03

标签: ios objective-c sprite-kit dealloc skscene

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

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

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

1 个答案:

答案 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内有一些保留它的东西。 因此,通过从中删除所有内容,我们消除了保留周期。

此解决方案并不总是有效,只有当SKActionsSKNodes中的某个人保留SKScene时才会有效,但您的问题仍然存在SKScene可以从其他地方保留,这个答案对你没有帮助