繁体   English   中英

在 replaceScene 之后永远不会调用场景的 cocos2d dealloc

[英]cocos2d dealloc of a scene is never called after replaceScene

我有一个 GameScene,我在其中添加了一个大图像作为孩子。 我想为每个关卡重新创建 GameScene。 但是在玩了几个关卡后,它收到了 memory 警告并最终崩溃。 永远不会调用 dealloc 方法。

从 MainScene 开始,点击“开始”按钮->

[[CCDirector sharedDirector] replaceScene: [GameScene scene]];

清关时->

[[CCDirector sharedDirector] replaceScene: [WinScene scene]];

当点击“下一步”按钮时->

[[CCDirector sharedDirector] replaceScene: [GameScene scene]];

等等......但是GameScene的dealloc永远不会被解雇。 (MainScene 和 WinScene 都可以)

对于 GameScene,我有一个

static GameScene* instanceOfGameScene;

其他相关方法:(我不认为是instanceOfGameScene保留了GameScene,因为这是我常用的方法,在我的其他项目中可以。)

-(id) init {
if ((self = [super init])) {

    instanceOfGameScene = self;
etc...


-(void) dealloc {
    CCLOG(@"game scene get dealloc'ed");
    instanceOfGameScene = nil;
    [super dealloc];
}



+(GameScene*) sharedScene
{
    return instanceOfGameScene;
}

在 WinScene 中,我执行 [[GameScene sharedScene] removeAllChildrenWithCleanup: YES] 5 秒后,GameScene 的 dealloc 方法终于被触发,程序收到信号:“EXC_BAD_ACCESS”。 在 CCNode class 中 -(void) removeAllChildrenWithCleanup:(BOOL)cleanup 方法的最后一行:

[children_ removeAllObjects];

堆栈更深的错误是CCArray removeAllObjects:

ccArrayRemoveAllObjects(data);

然后是:

/** Removes all objects from arr */
static inline void ccArrayRemoveAllObjects(ccArray *arr)
{
    while( arr->num > 0 )
        [arr->arr[--arr->num] release]; 
}

问题解决了。 我将按钮(带有块声明,可能保留 GameScene 的一些对象)放入 onEnter 方法中,并在 onExit 方法中将其删除,而不是仅将所有内容放入 init 方法中。 听起来可能很奇怪,但现在可以了。 ^_^经过一整天的调试,很高兴。

GameScene 没有理由成为 singleton; 当然不是一个糟糕的 singleton。 最肯定不是一个创建不佳的 singleton 在 [super dealloc] 可以调用之前取消设置。 绝对绝对不是一个糟糕的 singleton 甚至没有被正确使用。 singleton 的目的是让 class 在应用程序过程中初始化一次,而不是在 class 本身的生命周期内初始化。

如果修复 singleton 所以它是常规的 class 不能解决问题,那么您的问题出在您没有向我们展示的代码中。

此外,您可以在释放 GameScene 后点击 CCTextureCache 释放未使用的纹理。 这将对 memory 方面有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM