Cocos2d-iphone,更换场景时不调用dealloc

这是我现在面临的问题的简化版本.

我做了2个空的CCScene 1& 2并添加了CCLayer 1& 2到各自的场景.

我还添加了一个触摸功能,使用CCDirector的replacecescene从场景1切换到场景2.

但是,在替换场景中从未调用dealloc.

// scene & layer 2 are exactly the same as 1
@implementation MainScene

    -(void)dealloc {
     NSLog(@"scene dealloc");
     [super dealloc];
    }

    -(id)init {
     self = [super init];
     if (self) {
      layer = [[MainLayer alloc]init];
      [self addChild:layer];
      [layer release];
      NSLog(@"test: %i", [layer retainCount]); //1
     }

 return self;
}

@implementation MainLayer

-(void)dealloc {
 NSLog(@"layer dealloced");
 [super dealloc];
}

-(id)init {
 self = [super init];
 if (self) {
  self.isTouchEnabled = YES;
            NSLog(@"test %i", [self retainCount]); //1
 }
 return self;
}

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
 NSLog(@"test %i", [self retainCount]); //2 --> ????
 [[CCDirector sharedDirector] replaceScene:[[SecScene alloc]init]];
}

此外,当我触摸屏幕时,NSLog报告层的重新计算为2.这甚至假设发生了吗?任何人都可以告诉我我做错了什么,或者只是我误解了在调用dealloc之前retainCount需要为0?

这个问题导致我的主游戏程序只是通过一次又一次地使用静态精灵(和一些小动作)在各种场景/图层之间切换而崩溃.

最佳答案 我不太了解cocos2d的合同,但你不应该发布你在ccTouchesBeganon中分配的SecScene:[[CCDirector sharedDirector] replaceScene:[[SecScene alloc] init]]

我没有看到为什么replaceScene不会保留的任何原因,所以现在SecScene应该有一个保留计数为2.

更重要的是,如果你以类似的方式添加MainScene,这将解释为什么它的保留计数比你想要的高一个,所以它永远不会被释放.

点赞