Ios 如何取消分配未使用的场景

Ios 如何取消分配未使用的场景,ios,objective-c,sprite-kit,dealloc,skscene,Ios,Objective C,Sprite Kit,Dealloc,Skscene,我在GameViewController中设置了一个场景对象。我在SKScene子类中实现了dealloc,如下所示: - (void)dealloc { NSLog(@"Dealloc: %@", self); } 现在,我想在GameViewController上展示另一个视图控制器。我用故事板segue来做这个。但是在新的视图控制器出现之后,我从未收到过SKScene dealloc。它被卡在了记忆里。由于内存不足,我的应用程序在几分钟后开始冻结。演示新的视图控制器后,如何解除锁

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

- (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
可以从其他地方保留,而这个答案并不能真正帮助您解除分配
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
可以从其他地方保留下来,这个答案对你没有任何帮助

@user3351949我这样做了:
SKView*SKView=(SKView*)self.view;[skView presentScene:无]不起作用。@user3351949现在我这样做了:
SKView*SKView=(SKView*)self.view;游戏场景*场景=(游戏场景*)skView.scene;[skView presentScene:无];场景=零仍然不起作用您正在另一个ViewController的顶部显示ViewController。。。。当你展示下一个VC时,上一个VC不会被释放。。。。。这里创建的导航堆栈引用了堆栈中的所有内容。如果在从堆栈中删除上一个VC时显示您当前的内容。。。那么你就是VC,只要没有其他内容包含对它们的强引用,它各自的视图(SKView)就会被解除锁定。@user3351949我这样做了:
SKView*SKView=(SKView*)self.view;[skView presentScene:无]不起作用。@user3351949现在我这样做了:
SKView*SKView=(SKView*)self.view;游戏场景*场景=(游戏场景*)skView.scene;[skView presentScene:无];场景=零仍然不起作用您正在另一个ViewController的顶部显示ViewController。。。。当你展示下一个VC时,上一个VC不会被释放。。。。。这里创建的导航堆栈引用了堆栈中的所有内容。如果在从堆栈中删除上一个VC时显示您当前的内容。。。然后你是VC,只要没有其他内容包含对它们的强引用,它的相应视图(SKView)就会被解除锁定
,仍然不起作用。由于某些原因,GameSecene上的
NSLog
dealloc
方法仍然没有被调用。内存似乎没有被释放。请检查您是否有一个强大的指针循环->此方法实际上应该可以工作。哦,也许您还有一些操作?尝试删除所有操作,我将发布代码片段。请试一试。如果它不起作用,那么我建议在仪器中使用allocations配置文件,我使用了
[scene removeAllAction]仍然不起作用,也许苹果的私有API中有一个指针阻止场景解除锁定,名为
[scene removeFromParent]
,仍然不起作用。由于某些原因,GameSecene上的
NSLog
dealloc
方法仍然没有被调用。内存似乎没有被释放。请检查您是否有一个强大的指针循环->此方法实际上应该可以工作。哦,也许您还有一些操作?尝试删除所有操作,我将发布代码片段。请试一试。如果它不起作用,那么我建议在仪器中使用allocations配置文件,我使用了
[scene removeAllAction]仍然不起作用,也许苹果的私有API中有一个指针阻止了场景的释放