我有一个 GameScene,我在其中添加了一个大图像作为 child 。我想为每个级别重新创建 GameScene。但是在玩了几个关卡后,它收到内存警告并最终崩溃。永远不会调用 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方法终于被触发,Program收到信号:“EXC_BAD_ACCESS”。在 CCNode 类中 -(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 方法中。这听起来可能很奇怪,但它现在有效。
^_^调试了一整天,很开心。

关于iphone - 场景的 cocos2d dealloc 在 replaceScene 后永远不会被调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7048681/

10-14 16:54