ios - 如何释放未使用的 SKScene

标签 ios objective-c sprite-kit dealloc skscene

我在 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 中有一些东西保留了它。 因此,通过删除其中的所有内容,我们消除了保留循环。

此解决方案并不总是有效,只有当 SKActionsSKNodes 之一保留 SKScene 时,它才会有效是你的问题,但是你的 SKScene 可以从其他地方保留下来,这个答案不会真正帮助你

关于ios - 如何释放未使用的 SKScene,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35388658/

相关文章:

ios - 我有内存泄漏吗?

ios - 重新安装开发堆栈

objective-c - 在 OS X 应用程序中使用 FFMPEG

ios - 如何限制触摸时的节点外观

ipad - 如何制作一个在碰撞时具有物理主体不可移动/静态的 Sprite ?

ios - 在 Swift 中使用 Twilio 发送短信

ios - VNRecognizeTextRequest iOS 15 识别文本问题

objective-c - 使用 Cocoa 渲染像素缓冲区

ios - 使用 pangesture 在父 View 中移动 UIView

ios - swift 的 spritekit 声音设计