SpriteKit 场景未发布

Posted

技术标签:

【中文标题】SpriteKit 场景未发布【英文标题】:SpriteKit scene not being released 【发布时间】:2013-12-18 15:31:10 【问题描述】:

我有一个主菜单,它通过模态 segue 启动带有 SKView/SKScene 的视图控制器。然后我调用dismissViewControllerAnimated,它将应用程序返回到主菜单,但我仍然可以听到来自SKScene 的声音效果。当我多次重新启动 SKScene 时,应用程序最终崩溃了。

我已经尝试过一个堆分析教程 (http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/),但我似乎没有得到任何结果。我确保释放所有强大的@properties...

关于可能导致此问题的任何想法?任何代码/屏幕截图会有帮助吗,或者我可以提供任何信息来帮助缩小问题范围吗?

【问题讨论】:

ARC 已启用?检查所有强实例,您是否将它们中的任何一个存储在 skview/skscene 或 sk 视图控制器实例之外?另一个常见错误是图结构常见的保留循环,例如,当一个节点保持对其父节点或兄弟节点之一的强引用时(使这些节点变弱)。 是的,使用 ARC。关于。您的第二个问题,任何具有强实例的类在 viewDidUnload 或 dealloc 中都将它们设置为 nil,这还不够吗?我将深入研究代码以调查您的最后一点。 不幸的是,修复所有我能找到的保留周期似乎没有帮助...... 您是否尝试过以另一种方式解散 VC - 就像放松转场一样? 原来是因为这个:cocoa.tumblr.com/post/62812809698/… - @LearnCocos2D 随意将参考周期作为答案 【参考方案1】:

从提供的信息中很难知道。我可以告诉你我有一个类似的问题,结果证明它与 SKAction 对象有关。我将动作缓存为场景的属性,然后让子节点运行这些动作。我发现确保名为 removeAllActions 的子节点为我消除了这个问题。大致如下:

-(void) willMoveFromView:(SKView *)view

   [self.children enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
        SKNode* child = obj;
        [child removeAllActions];
    ];

    [self removeAllChildren];

不确定这是否是您所面临的,但可能需要注意。

【讨论】:

【参考方案2】:

您可以通过以下方式实现您的dismissViewControllerAnimated 方法调用。

[self dismissViewControllerAnimated:NO completion:^
    // release the SKScene here....
];

【讨论】:

我没有使用导航控制器,只是模态 segues 和 UIViewControllers 好的,在这种情况下你仍然可以实现dismissViewControllerAnimate:completion 块方法并释放块中的对象。 发布代码在viewDidUnload时为什么要这么做? ViewDidUnload 在 ios 6 中将无法使用,因为它已被弃用。 请参考***.com/questions/7292119/…

以上是关于SpriteKit 场景未发布的主要内容,如果未能解决你的问题,请参考以下文章

Spritekit 节点未从内存中删除

在 SpriteKit 中添加到父级时未显示未归档节点

SpriteKit SKScene 未正确调整大小以适合 iPhone 12

SpriteKit:场景完成呈现时回调?

spritekit 场景转换工作不正确

SpriteKit:在场景之间传递数据