closuresSKScene后,内存仍然很高

我使用dispatch_once NSObject来创build数据指针。 所以所有的游戏资产指针都是在主视图控制器出现的时候创build的。 为了玩游戏,用户点击UIViewController上对应于特定级别的UIButton 。 我把它称为LevelSelectionController。 游戏结束后,用户将点击一个标签( SKLabel )。 所有的动作和节点都将被删除。

[self removeAllActions]; [self removeAllChildren]; [self removeFromParent]; 

此外,特定级别的SKScene子类将委派用户返回LevelSelectionController给展示游戏SKView的视图控制器的任务如下。

 - (void)closeScene { SKView *spriteView = [[SKView alloc] init]; [spriteView presentScene:nil]; [self.navigationController popViewControllerAnimated:YES]; } 

我唯一的问题是当用户离开游戏场景(SKScene)时内存仍然很高。 游戏需要大量资产。 所以当游戏开始时,内存使用量将跳到200 MB。 当用户返回到原始级别select视图控制器时,根据活动监视器 ,游戏模拟器仍然消耗200 MB。 当用户input不同的级别时,内存使用量将会跳过另外10 MB。 那么一旦用户离开SKScene,我怎么能释放上一场比赛的内存呢?

我正在使用ARC。 Xcode版本是5.1。 开发目标是iOS 7.1。

感谢您的帮助。

– 编辑1 –

我太愚蠢。 我知道问题是什么 当我closures这个场景时,我正在创build一个新的SKView,然后我将它设置为零来摆脱当前场景。 有用。 但是,这不应该是这样做的方式。 相反,我需要在呈现之前将当前的SKView设置为一个variables。 当我closures场景时,我需要将该variables设置为零。 嗯…我没在想。

– 编辑2 – 当前场景显示为零时几乎没有变化。 从removeFromSuperview删除它没有太大的作用。

在SO上有几个人注意到,当包含的SKView从其超级视图中被移除时,SKScene被解除分配。

看看这些问题和他们的答案:

在过渡到SpriteKit中的另一个SKScene之后,释放SKScene

iOS 7 Sprite Kit释放内存

另外,请尝试修改closeScene方法,如下所示:

 - (void)closeScene { SKView *spriteView = (SKView*)self.view; [spriteView presentScene:nil]; [self.navigationController popViewControllerAnimated:YES]; } 

NSLog()放到SKScenedealloc方法中,确保它是释放的。

另外,在场景的引用次数达到0之后,可能不会释放资源。由于内部优化,资源可能会一直保留在内存中,直到收到内存警告信号。