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 搜索和替换命令时不起作用
我们可以在 UIActionsheet 中使用 CCMenuItemToggle 吗?(cocos2d-iphone)
通过编程指南和源码学习cocos2d-iphone的感觉迷失了
为啥 glBindFramebuffer(GL_FRAMEBUFFER, 0) 会导致 cocos2D-iphone 出现黑屏?