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

时间:2010-06-30 06:24:09

标签: iphone memory cocos2d-iphone

这是我现在面临的问题的简化版本。 我做了2个空的CCScene 1& 2并添加了CCLayer 1& 2到各自的场景。 我还添加了一个触摸功能,使用CCDirector的替换从场景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?

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

2 个答案:

答案 0 :(得分:2)

我不太了解cocos2d的合同,但是你不应该在SecScene上释放ccTouchesBegan分配给[[CCDirector sharedDirector] replaceScene:[[SecScene alloc]init]]

我没有看到replaceScene无法保留的任何理由,所以现在SecScene的保留计数为2时应该有一个。

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

答案 1 :(得分:0)

此外,dealloc只被我很少发现 - 所以很难测试并调用它...