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

Posted

技术标签:

【中文标题】Cocos2d-iphone,替换场景时不调用dealloc【英文标题】:Cocos2d-iphone,not calling dealloc when replacing scene 【发布时间】:2010-06-30 06:24:08 【问题描述】:

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

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

【问题讨论】:

提示:使用自动释放,省去很多内存管理的麻烦! 【参考方案1】:

我对 cocos2d 的合约不太了解,但你不应该在ccTouchesBegan这一行上释放SecScene 你在ccTouchesBegan 上分配:[[CCDirector sharedDirector] replaceScene:[[SecScene alloc]init]]

我看不出replaceScene 不保留的任何原因,所以现在SecScene 的保留计数应该是2。

更重要的是,如果您以类似的方式添加 MainScene,就可以解释为什么它的保留计数比您希望的高一,所以它永远不会被释放。

【讨论】:

【参考方案2】:

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

【讨论】:

在这种情况下,您很可能会因为不匹配分配/释放而泄漏内存......这不是 dealloc 方法的错误,而是您分配/保留/释放的内容、时间和地点导致了 dealloc不叫

以上是关于Cocos2d-iphone,替换场景时不调用dealloc的主要内容,如果未能解决你的问题,请参考以下文章

从另一个 Perl 脚本内部调用 Perl 搜索和替换命令时不起作用

调试时不调用 WebMethod

我们可以在 UIActionsheet 中使用 CCMenuItemToggle 吗?(cocos2d-iphone)

通过编程指南和源码学习cocos2d-iphone的感觉迷失了

为啥 glBindFramebuffer(GL_FRAMEBUFFER, 0) 会导致 cocos2D-iphone 出现黑屏?

Cocos2D-iphone 在 CCTexture2D 中使用 drawAtpoint 函数出现问题