这是我现在面临的问题的简化版本.
我做了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,这将解释为什么它的保留计数比你想要的高一个,所以它永远不会被释放.