这是我现在面临的问题的简化版本。 我做了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?
这个问题导致我的主游戏程序只是通过一次又一次地使用静态精灵(和一些小动作)在各种场景/图层之间切换而崩溃。
答案 0 :(得分:2)
我不太了解cocos2d的合同,但是你不应该在SecScene
上释放ccTouchesBegan
分配给[[CCDirector sharedDirector] replaceScene:[[SecScene alloc]init]]
我没有看到replaceScene
无法保留的任何理由,所以现在SecScene
的保留计数为2时应该有一个。
更重要的是,如果你以类似的方式添加MainScene
,这可以解释为什么它的保留计数比你想要的高一个,所以它永远不会被解除分配。
答案 1 :(得分:0)
此外,dealloc只被我很少发现 - 所以很难测试并调用它...