SpriteKit场景未被释放。

5
我有一个主菜单,通过模态转场启动了一个带有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...
有什么想法可能导致这个问题?是否提供任何代码/截图或者其他信息可以帮助缩小问题范围?

Instruments


2
启用ARC了吗?检查所有强引用实例,你是否将它们存储在skview/skscene或sk视图控制器实例之外?另一个常见的错误是保留循环,通常出现在图形结构中,例如当一个节点保持对其父节点或兄弟节点之一的强引用时(将其设为弱引用)。 - CodeSmile
是的,使用ARC。关于你的第二个问题,任何具有强实例的类都会在viewDidUnload或dealloc中将它们设置为nil,这不够吗?我会深入代码调查你最后一个问题。 - David Lawson
不幸的是,我找到的所有保留循环引用问题似乎都没有帮助... - David Lawson
我通过将其从强引用更改为弱引用来修复了保留循环。 - David Lawson
1
结果是由于这个原因:http://cocoa.tumblr.com/post/62812809698/uiviewcontroller-transitioning-delegate-retain-cycle - @LearnCocos2D 可以将引用循环作为答案。 - David Lawson
显示剩余2条评论
2个回答

4

从提供的信息中很难知道问题所在。我可以告诉你,我曾经遇到过类似的问题,与SKAction对象有关。我将这些Actions作为场景属性进行缓存,然后让子节点运行这些Actions。后来发现,确保子节点调用removeAllActions可以解决我的问题。类似这样的:

-(void) willMoveFromView:(SKView *)view
{
   [self.children enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        SKNode* child = obj;
        [child removeAllActions];
    }];

    [self removeAllChildren];
}

不确定您是否遇到了这个问题,但可能是需要注意的事项。

0
您可以按照以下方式实现dismissViewControllerAnimated方法的调用。
[self dismissViewControllerAnimated:NO completion:^{    // release the SKScene here....}];

我没有使用导航控制器,只是使用模态转场和UIViewControllers。 - David Lawson
那么,在这种情况下,您仍然可以实现dismissViewControllerAnimate:completion块方法,并在块中释放对象。 - ldindu
1
ViewDidUnload从iOS 6开始已被弃用,因此将无法使用。 - ldindu
请参考以下网址:https://dev59.com/DWw05IYBdhLWcg3wXAmF - ldindu
你实现了dealloc吗? - ldindu
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接